Ford-Fulkerson算法模板

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

 

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