样例都过不了,求助qwq。
查看原帖
样例都过不了,求助qwq。
227824
JK_LOVER楼主2020/7/21 11:43
#include<bits/stdc++.h>
using namespace std;
int read()
{
	int x=0,f=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	return f?-x:x;
}
const int inf = 0x3f3f3f3f;
const int N = 2010;
int n,m,head[N],cnt,S,T;
struct edge{int cap,flow,nxt,to,w;}e[N];
void add(int x,int y,int c,int f,int w)
{
	e[++cnt].flow = f;e[cnt].cap = c;
	e[cnt].to = y;e[cnt].nxt = head[x];e[cnt].w = w;
	head[x] = cnt;
}
int cost;
int lastedge[N],lastnode[N],a[N],dis[N],vis[N];
bool bfs(int s,int t,int opt)
{
	memset(dis,inf,sizeof(dis));
	memset(a,0,sizeof(a));
	memset(vis,0,sizeof(vis));
	deque<int> que;
	a[s] = inf;dis[s] = 0;lastnode[s] = -1;vis[s] = 1;
	que.push_back(s);
	while(que.size())
	{
		int x = que.front();
		que.pop_front();
		vis[x] = 0;
		for(int i = head[x];~i;i = e[i].nxt)
		{
			if(e[i].cap > e[i].flow)
			{
				int y = e[i].to;
				if(dis[y] > dis[x] + e[i].w)
				{
					lastnode[y] = x;
					lastedge[y] = i;
					dis[y] = dis[x] + e[i].w;
					a[y] = min(e[i].cap - e[i].flow,a[x]);
					if(vis[y]) continue;
					vis[y] = 1;
					if(que.size())
					{
						if(dis[y] < dis[que.front()])
						que.push_front(y);
						else que.push_back(y);
					}
					else que.push_back(y);
				}
			}
		}
	}
	return a[t] > 0;
}
int S_m[N],n_T[N],m_n[N][N];
int EK(int s,int t,int opt)
{
	memset(head,-1,sizeof(head));
	cnt = -1;
	for(int i = 1;i <= m;i++)
	{
		int cap = S_m[i];
		add(s,i,cap,0,0);
		add(i,s,0,0,0);
	}
	for(int i = 1+m;i <= n+m;i++)
	{
		int cap = n_T[i];
		add(i,t,cap,0,0);
		add(t,i,0,0,0);
	}
	for(int i = 1;i <= m;i++)
	{
		for(int j = 1+m;j <= n+m;j++)
		{
			int w = m_n[i][j];
			add(i,j,inf,0,w*opt);
			add(j,i,0,0,-w*opt);
		}
	}
	cost = 0;
	while(bfs(s,t,opt))
	{
		cost += opt*dis[t]*a[t];
		int u = t;
		while(u != s)
		{
			e[lastedge[u]].flow += a[t];
			e[lastedge[u]^1].flow -= a[t];
			u = lastnode[u];	
		}	
		cout<<"opt:: "<<opt<<"     maxflow:: "<<a[t]<<endl;
	}
	return cost;
}
int main()
{
	n = read();m = read();
	S = n+m+9;
	T = n+m+10;
	for(int i = 1;i <= m;i++) S_m[i] = read();
	for(int i = m+1;i <= m+n;i++) n_T[i] = read();
	for(int i = 1;i <= m;i++) 
	for(int j = m+1;j <= n+m;j++) m_n[i][j] = read();
	int ans_min = EK(S,T,1);
	int ans_max = EK(S,T,-1);
	cout<<ans_min<<endl<<ans_max<<endl;
	return 0;
}
2020/7/21 11:43
加载中...