萌新求助dinic,WA0
查看原帖
萌新求助dinic,WA0
196899
lndjy18智99楼主2021/2/6 20:40

代码最后有测试数据

#include<iostream>
#include<cstring>
#include<queue>
#define S (n+m+1)
#define T (n+m+2) 
using namespace std;
const int N=10005,inf=0x7fffffff;
int n,m,cnt;
struct edge
{
	int to,nxt,v;
}e[N*15];
int head[N],dep[N],cur[N];
void add(int u,int v,int w)
{
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
	e[cnt].v=w;
}
bool bfs()
{
	queue<int> q;
	memset(dep,0,sizeof dep);
	dep[S]=1;
	q.push(S);
	while(!q.empty())
	{
		int now=q.front();q.pop();
		for(int i=head[now];i;i=e[i].nxt)
		{
			if(dep[e[i].to]==0&&e[i].v>0)
			{
				dep[e[i].to]=dep[now]+1;
				q.push(e[i].to);
			}
		}
	}
	return dep[T]>0;
}
int dfs(int now,int flow)
{
	if(now==T) return flow;
	for(int& i=cur[now];i;i=e[i].nxt)
	{
		if(dep[e[i].to]!=dep[now]+1||e[i].v==0) continue;
		int d=dfs(e[i].to,min(flow,e[i].v));
		if(d>0)
		{
			e[i].v-=d;
			if(i%2) e[i+1].v-=d;
			else e[i-1].v-=d;
			return d;
		}
	}
	return 0;
}
int dinic()
{
	int ans=0;
	while(bfs())
	{
		for(int i=1;i<=n+m+2;i++)
		cur[i]=head[i];
		int d;
		while(d=dfs(S,inf))
		ans+=d;
	}
	return ans;
}
int main()
{
	cin>>n>>m;
	int M;
	cin>>M;
	for(int i=1;i<=n;i++)
	add(S,i,inf),add(i,S,0);
	for(int i=1;i<=m;i++)
	add(i+n,T,inf),add(T,i+n,0);
	for(int i=1;i<=M;i++)
	{
		int u,v;
		cin>>u>>v;
		add(u,v+n,1);
		add(v+n,u,0);
	}
	cout<<dinic();
 	return 0;
}
/*in:4 2 12
3 1
1 2
3 2
3 1
1 1
3 2
4 2
4 1
1 1
1 2
3 2
3 1
out:2
myout:12
*/
2021/2/6 20:40
加载中...