网络流Dinic求调
  • 板块灌水区
  • 楼主Willan_Lian
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/1/26 16:47
  • 上次更新2024/1/26 16:49:08
查看原帖
网络流Dinic求调
223620
Willan_Lian楼主2024/1/26 16:47
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,cnt,head[10010],ST,ED;
struct e{int nxt,to,c,f;}E[200010];
void add_edge(int u,int v,int c){
	E[cnt].nxt=head[u];E[cnt].to=v;E[cnt].c=c;head[u]=cnt++;
	E[cnt].nxt=head[v];E[cnt].to=u;E[cnt].c=0;head[v]=cnt++;
}

int level[10010],vis[10010];
bool bfs(){
	queue<int> Q;
	Q.push(ST);
	vis[ST]=1;
	
	while(!Q.empty()){
		int u=Q.front();
		Q.pop();
		
		for(int i=head[u];~i;i=E[i].nxt){
			e Edg=E[i];int v=Edg.to;
			if(!vis[v] && Edg.c>Edg.f){
				vis[v]=1;
				level[v]=level[u]+1;
				if(v==ED) return 1;
				Q.push(v);
			}
		}
	}
	return 0; 
}

long long dfs(int u,int imp){
	if(u==ED || imp==0) return imp;
	long long ret=0;int f;
	
	for(int i=head[u];~i;i=E[i].nxt){
		e Edg=E[i];int v=Edg.to;
		f=dfs(v,min(imp,Edg.c-Edg.f));
		if(level[v]==level[u]+1 && f>0){
			Edg.f+=f;
			E[i^1].f-=f;//双向边以相邻形式配对
			ret+=f;//总流量++ 
			imp-=f;//可改进量减少 
			if(imp==0) break; 
		}
	}
	
	return ret;
}

long long Dinic(){
	long long flow=0;
	while(bfs()) flow+=dfs(ST,inf);
	return flow;
}

int main(){
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int s,e,c;
		scanf("%d%d%d",&s,&e,&c);
		add_edge(s,e,c);
	}
	scanf("%d%d",&ST,&ED);
	printf("%lld",Dinic());
	return 0;
}
2024/1/26 16:47
加载中...