poj 1273 Drainage Ditches--最大流--Dinic

来源:互联网 发布:java的所有数据类型 编辑:程序博客网 时间:2024/05/21 14:00
/*之前用EK写过这题,现在学dinic,又写了这个题*/#include<stdio.h>#include<string.h>#include<queue>using namespace std;int map[205][205],lvl[205];int n,m,ret;int bfs()//分层{int u,i;memset(lvl,0,sizeof(lvl));queue<int>q;q.push(1);lvl[1]=1;while(!q.empty()){u=q.front();q.pop();for(i=1;i<=m;i++){if(!lvl[i]&&map[u][i]>0){lvl[i]=lvl[u]+1;q.push(i);}}}return lvl[m]!=0;}int min(int a,int b){return a<b?a:b;}int dfs(int u,int ff)//递归求增广路径{int i,z;int tt=ff;if(u==m) return ff;for(i=1;i<=m&&tt;i++){if(lvl[i]==lvl[u]+1&&map[u][i]>0){z=dfs(i,min(tt,map[u][i]));map[u][i]-=z;map[i][u]+=z;tt-=z;}}return ff-tt;}int main(){int i,a,b,c;while(scanf("%d %d",&n,&m)!=EOF){ret=0;memset(map,0,sizeof(map));for(i=1;i<=n;i++){scanf("%d%d%d",&a,&b,&c);map[a][b]+=c;}while(bfs())ret+=dfs(1,0x7fffffff);//有的人把这写在了while循环里边,不知道为什么,好像在回溯的时候就会找完增广路径吧?谁知到,给回复个    printf("%d\n",ret);}return 0;}

原创粉丝点击