poj1273 Drainage Ditches
//356K 0MS第一道网络流的题,注意重边
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; int linjie[220][220]; bool visit[220]; int pre[220];//找这个节点之前的节点 int N,M; queue<int>Q; void dayin() { int i,j; for(i=1;i<=M;i++) { for(j=1;j<=M;j++) { printf("%d ",linjie[i][j]); } printf("\n"); } printf("\n"); } int augment() { memset(visit,false,sizeof(visit)); memset(pre,0,sizeof(pre)); pre[1]=1; while(!Q.empty()) { Q.pop(); } int i; int qi=1; Q.push(qi); visit[1]=true; bool found=false;; while(!Q.empty()) { int temp=Q.front();Q.pop(); for(i=1;i<=M;i++) { if(linjie[temp][i]!=0&&!visit[i]) { if(i==M) { found=true; } Q.push(i); pre[i]=temp; visit[i]=true; if(found) { break; } } } if(found) { break; } } int minflow=-1; int linshi=M; while(pre[linshi]!=linshi) { if(linjie[pre[linshi]][linshi]<minflow||minflow==-1) { minflow=linjie[pre[linshi]][linshi]; } linshi=pre[linshi]; } linshi=M; while(pre[linshi]!=linshi) { linjie[pre[linshi]][linshi]-=minflow; linjie[linshi][pre[linshi]]+=minflow; linshi=pre[linshi]; } //dayin(); return minflow; } int main() { while(scanf("%d %d",&N,&M)!=EOF) { int i,j; for(i=1;i<=M;i++) { for(j=1;j<=M;j++) { linjie[i][j]=0; } } int a,b,c; for(i=0;i<N;i++) { scanf("%d %d %d",&a,&b,&c); linjie[a][b]+=c; } //dayin(); int maxflow=0; int aug; while(aug=augment()) { maxflow+=aug; //dayin(); } printf("%d\n",maxflow); } return 0; }