最大流的Edmonds-Karp方法 poj1273

View Code
 1 #include<iostream>
2 #include<stdio.h>
3 #include<queue>
4 #include<cstring>
5 using namespace std;
6 #define MaxSize 1000
7 #define MaxNum 0xfffffff
8 int g[MaxSize][MaxSize];
9
10 int Augment(int g[][MaxSize],int n,int s,int t)
11 {
12 deque<int> q;
13 int pre[MaxSize];
14 bool visited[MaxSize];
15 bool bo=false;
16 memset(visited,0,(n+1)*sizeof(int));
17 visited[s]=true;
18 q.push_back(s);
19 pre[s]=-1;
20 while (!q.empty())
21 {
22 int v=q.front();
23 q.pop_front();
24 for (int i=1;i<=n;i++)
25 if (!visited[i] && g[v][i]>0)
26 {
27 visited[i]=1;
28 pre[i]=v;
29 q.push_back(i);
30 if (i==t) {
31 q.clear(); //比较好的退出while循环的方法
32 bo=true;
33 break;
34 }
35 }
36 }
37 if (!bo) return 0;
38 int k=t;
39 int minn=MaxNum;
40 while (pre[k]!=-1)
41 {
42 if (g[pre[k]][k]<minn) minn=g[pre[k]][k];
43 k=pre[k];
44 }
45 k=t;
46 while (pre[k]!=-1)
47 {
48 g[pre[k]][k]-=minn;
49 g[k][pre[k]]+=minn;
50 k=pre[k];
51 }
52 return minn;
53 }
54
55 int MaxFlow(int g[][MaxSize],int n,int s,int t)
56 /* g图的矩阵表示 n顶点数 顶点的标号从1开始
57 s源点 t汇点
58 */
59 {
60 int maxflow=0,aug;
61 while (aug=Augment(g,n,s,t)) maxflow+=aug;
62 return maxflow;
63 }
64 int main()
65 {
66 freopen("in.txt","r",stdin);
67 int n,m;
68 while (cin>>n>>m)
69 {
70 memset(g,0,sizeof(g));
71 for (int i=1;i<=n;i++)
72 {
73 int x,y,z;
74 cin>>x>>y>>z;
75 g[x][y]+=z;
76 }
77 cout<<MaxFlow(g,m,1,m)<<endl;
78 }
79 return 0;
80 }

犯的错误
在定义最大值时居然定义为0xffffffff

忘了虽然int是32位的,但是它不是unsigned的

posted @ 2012-02-20 23:24  徐徐而来  阅读(134)  评论(0编辑  收藏  举报