蒟蒻求助 Dinic,样例没过,一直输出 0
查看原帖
蒟蒻求助 Dinic,样例没过,一直输出 0
232460
xiaoqian02楼主2023/1/29 12:11

rt

代码:

#include<bits/stdc++.h>
#define inf 114514
using namespace std;
void IOS()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	return;
}
struct Edge
{
	int zd,nxt,w;
}ed[20005];
int n,m,s,t,d,cnt,u,v;
int hd[1005],dep[1005],dqh[1005];
bool mp[505][505];
void set_edge(int u,int v)
{
	cnt++;
	ed[cnt].zd=v;
	ed[cnt].w=1;
	ed[cnt].nxt=hd[u];
	hd[u]=cnt;
	cnt++;
	ed[cnt].zd=u;
	ed[cnt].w=0;
	ed[cnt].nxt=hd[v];
	hd[v]=cnt;
	return;
}
bool bfs(int x)
{
	for(int i=1;i<=n;i++) dep[i]=inf;
	dep[x]=0;
	queue<int> q;
	dqh[x]=hd[x];
	q.push(x);
	while(!q.empty())
	{
		int p=q.front();
		q.pop();
		for(int i=hd[p];i;i=ed[i].nxt)
		{
			int kkk=ed[i].zd;
			if(dep[kkk]!=inf||!ed[i].w) continue;
			dqh[kkk]=hd[kkk];
			dep[kkk]=dep[p]+1;
			q.push(kkk);
			if(kkk==t) return 1;
		}
	}
	return 0;
}
int dfs(int x,int maxx)
{
	if(x==t) return maxx;
	int k,sm=0;
	for(int i=dqh[x];i&&(maxx>0);i=ed[i].nxt)
	{
		dqh[x]=i;
		int p=ed[i].zd;
		if(ed[i].w==0||dep[p]!=dep[x]+1) continue;
		k=dfs(p,min(maxx,ed[i].w));
		if(k==0) dep[p]=inf;
		ed[i].w-=k;
		ed[i^1].w+=k;
		maxx-=k;
		sm+=k;
	}
	return sm;
}
int dinic()
{
	int sm=0;
	while(bfs(s)) sm+=dfs(s,inf);
	return sm;
}
int main()
{
	IOS();
	cin>>n>>m>>d;
	cnt=1;
	s=1;
	t=n+m+2;
	for(int i=1;i<=n;i++) set_edge(s,i+1);
	for(int i=1;i<=d;i++)
	{
		cin>>u>>v;
		if(!mp[u][v]&&u<=n&&v<=m)
		{
			mp[u][v]=1;
			set_edge(u+1,v+n+1);
		}
	}
	for(int i=1;i<=m;i++) set_edge(i+n+1,t);
	cout<<dinic()<<endl;
	return 0;
}
2023/1/29 12:11
加载中...