/* Name: MaxFlow.. Copyright: Author: moon@whu Date: 03-08-06 11:02 Description:矩阵,,可能慢点。。 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxL 200 #define INF 987654321 int C[maxL][maxL],F[maxL][maxL],path[maxL][2]; int que[maxL*maxL+1],rear,pre,n,m; int Find(int st,int nt) { int i,j,k,a; que[0] = st; memset(path,-1,sizeof(path)); path[st][0] = st; path[st][1] = INF; pre = 0; rear = 1; while(pre<rear) { k = que[pre]; pre++; a = path[k][1]; for(i=1; i<=n; i++) if(path[i][0]==-1&&C[k][i] - F[k][i]>0) { path[i][0] = k; path[i][1] = (C[k][i]-F[k][i]>a ? a : C[k][i] - F[k][i]); que[rear++] = i; if(i==nt) return 1; } } return 0; } int MaxFlow(int st,int nt) { int i,j,k; while(Find(st,nt)){ j = nt; k = path[nt][1]; //printf("%d----/n",k); do{ i = path[j][0]; F[i][j]+=k; F[j][i]-=k; // printf("%d-%d-/n",i,j); j = i; }while(j!=st); // getchar(); } k=0; for(i=1; i<=n; i++) k+=F[st][i]; return k; } int main() { int i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { memset(C,0,sizeof(C)); memset(F,0,sizeof(F)); while(m--){ scanf("%d%d%d",&i,&j,&k); C[i][j] =k; } k = MaxFlow(1,n); printf("%d-/n",k); } return 0; } /* 6 10 1 2 4 1 3 8 2 4 4 2 3 4 2 5 1 3 4 2 3 5 2 4 6 7 5 4 6 5 6 9 8 */ ---算法不难,实现起来也没啥困难, 链表实现的,偶也能马马虎虎敲个标程出来... 不过就是对这个不开窍,看到题目也不往这个上面想,就是看出是网络流也建不起模型.-_-.. 还好,由于tank的存在,这种题基本上也轮不到我去做, 不过长时间不写,对这个就越发生疏了... 发表于: 2006-10-10,修改于: 2006-10-17 09:30 ============================ 偷懒,原封不动的转了。 ============================