最大流 Dinic 版子

xiaoxiao2021-02-27  154

#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int n,m; int dis[300]; struct Node { int u,v,w,next; }edges[500]; int head[300],p=0; void add(int u,int v,int w) { edges[p].u=u; edges[p].v=v; edges[p].w=w; edges[p].next=head[u]; head[u]=p++; } int bfs(int st,int ex) { memset(dis,-1,sizeof(dis)); queue<int>que; while(!que.empty()) que.pop(); que.push(st); dis[st]=0; while(!que.empty()) { int c=que.front();que.pop(); for(int i=head[c];i!=-1;i=edges[i].next) { int to=edges[i].v,w=edges[i].w; if(dis[to]==-1&&w>0) { dis[to]=dis[c]+1; que.push(to); } } } if(dis[ex]>0) return 1; return 0; } int dfs(int st,int flow,int ex) { if(st==ex){return flow;} for(int i=head[st];i!=-1;i=edges[i].next) { int to=edges[i].v,w=edges[i].w,tmp; if(dis[st]+1==dis[to]&&(tmp=dfs(to,min(flow,w),ex))) { edges[i].w=edges[i].w-tmp; edges[i^1].w=edges[i^1].w+tmp; return tmp; } } return 0; } int solve(int st,int ex,int inf) { int maxflow=0; while(bfs(st,ex)) { int minflow=dfs(st,inf,ex); maxflow=maxflow+minflow; } return maxflow; } int main() { while(scanf("%d%d",&m,&n)!=EOF) { memset(head,-1,sizeof(head)); p=0; int inf=0; for(int i=0;i<m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,0); inf=inf+w; } printf("%d\n",solve(1,n,inf)); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-13092.html

最新回复(0)