【玄关】Dinic求调
查看原帖
【玄关】Dinic求调
659165
mysterys楼主2024/7/9 11:23

rtrt,样例无输出。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int M=5e4+10,N=1005;
const int inf=1e9;
int s,t,n,m,T;
struct edge{
	int nxt,to,dis;
}e[M<<1];
int head[N<<1],cnt=1;
int dep[N],cur[N];
inline void add(int u,int v,int d){
	e[++cnt]=(edge){head[u],v,d};
	head[u]=cnt;
}
namespace Net{
	bool bfs(){
		queue<int>q;
		while(!q.empty()) q.pop();
		for(int i=1;i<=n;i++) 
			dep[i]=0;
		dep[s]=1;
		q.push(s);
		while(!q.empty()){
			int u=q.front();q.pop();
			for(int i=head[u];i;i=e[i].nxt){
				if(e[i].dis>0&&dep[e[i].to]==0){
					dep[e[i].to]=dep[u]+1;
					q.push(e[i].to);
				}
			}
		}
		if(dep[t]) return 1;
		else return 0;
	}
	int dfs(int u,int dist){
		if(u==t) return dist;
		for(int& i=cur[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(dep[v]==dep[u]+1&&e[i].dis!=0){
				int d=dfs(v,min(dist,e[i].dis));
				if(d>0){
					e[i+1].dis-=d;
					e[i^1].dis+=d;
					return d;
				}
			}
		}
		return 0;
	}
	inline int Dinic(){
		int ans=0;
		while(bfs()){
			for(int i=1;i<=n;i++)
				cur[i]=head[i];
			while(int di=dfs(s,inf))
				ans+=di;
		}
		return ans;
	}
}
signed main(){
	cin.tie(nullptr)->sync_with_stdio(false);
	cout.tie(nullptr);
	cin>>n>>m>>T;
	s=0,t=n+m+1;
	for(int i=1;i<=n;i++){
		add(0,i,1);
		add(i,0,0);
	}
	for(int i=n+1;i<=n+m;i++){
		add(i,t,1);
		add(t,i,0);
	}
	for(int i=1;i<=T;i++){
		int u,v;
		cin>>u>>v;
		add(u,v+n,1);
		add(v+n,u,0);
	}
	cout<<Net::Dinic();
	return 0;
} 
2024/7/9 11:23
加载中...