80网络流help
查看原帖
80网络流help
388414
comcopy楼主2023/8/31 21:27
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline bool _u(char x){return x>='0'&&x<='9';}
inline int read(){
	int f,x;
	char ch=getchar();
	for(f=1;!_u(ch);ch=='-'&&(f=-1),ch=getchar());
	for(x=0;_u(ch);x=(x<<1)+(x<<3)+(ch^48),ch=getchar());
	return x*f;
}
inline void write(int num){
	static int st[39],tp=0;
	num<0&&(putchar('-'),num=-num);
	do st[++tp]=num%10; while(num/=10);
	while(tp) putchar(st[tp--]|48);
	return;
}
//拆点,最大流=最小割
const int N=410,M=610,inf=1e9;

struct node{
	int to,nxt,val;
}e[M<<2];
int head[N<<1];
inline void add(int u,int v,int w){
	static int tot=1;
	e[++tot]=<%v,head[u],w%>,head[u]=tot;
}
int now[N<<1],dis[N<<1];
int n;
inline bool bfs(int s,int t){
	for(int i=1;i<=(n<<1);++i) dis[i]=inf;
	queue<int>q;
	q.push(s);
	dis[s]=0,now[s]=head[s];
	for(int u;!q.empty();){
		u=q.front(),q.pop();
		for(int i=head[u],to;i;i=e[i].nxt)
			if(e[i].val>0 && dis[to=e[i].to]==inf){
				q.push(to),dis[to]=dis[u]+1,now[to]=head[to];
				if(to==t)return true;
			}
	}
	return false;
}

inline int dfs(int u,int t,int sum){
	if(u==t)return sum;
	int res=0;
	for(int i=now[u],to;i&&sum;i=e[i].nxt){
		now[u]=i;
		if(e[i].val>0&&dis[to=e[i].to]==dis[u]+1){
			int k=dfs(to,t,min(sum,e[i].val));
			if(!k) dis[to]=inf;
			e[i].val-=k,e[i^1].val+=k;
			res+=k,sum-=k;
		}
	}
	return res;
}

int m,s,t;
signed main(){
//	freopen("P1345_1.in","r",stdin);
	n=read(),m=read(),s=read()+n,t=read();
	for(int i=1;i<=n;++i)
		add(i,i+n,1),add(i+n,i,0);
	
	
	for(int i=1,u,v;i<=m;++i){
		u=read(),v=read();
		add(u+n,v,inf);
		add(v,u+n,0);
		add(v+n,u,inf);
		add(u,v+n,0);
	}
	
	int ans=0;
	for(;bfs(s,t);ans+=dfs(s,t,inf));
	write(ans),puts("");
	
	return(0-0);
}



2023/8/31 21:27
加载中...