poj1273 Drainage Ditches (最大流)
用Edmonds Karp算法(Ford_Fulkerson算法)实现的最大流。
这题注意一下两点间可以有多条路径就OK了(代码第97行).
以下是AC代码:
Code
1 #include <iostream>
2 #define SIZE 201
3 using namespace std;
4
5 int eg, vtx;
6 int map[SIZE][SIZE]; //图的邻接矩阵
7 //FIFO queue============================================
8 struct QUEUE{
9 int queue[SIZE];
10 int head;
11 int tail;
12 };
13 struct QUEUE q;
14 int color[SIZE], par[SIZE];
15
16 int InitQ(){
17 q.head=q.tail=0;
18 return 1;
19 }
20 int EnQ(int x){
21 q.queue[q.tail]=x;
22 q.tail++;
23 return 1;
24 }
25 int DeQ(){
26 int x;
27 x=q.queue[q.head];
28 q.head++;
29 return x;
30 }
31 //=====================================================
32
33 int BFSSearchPath()
34 {
35 int i, u, v, flag;
36 flag=0;
37 InitQ();
38 for (i=2;i<=vtx;i++){
39 color[i]=0;
40 par[i]=-1;
41 }
42 color[1]=1;
43 par[1]=-1;
44 EnQ(1);
45 while (q.head!=q.tail && !flag){
46 u=DeQ();
47 for (v=1;v<=vtx;v++){
48 if (map[u][v]!=0 && color[v]==0){
49 color[v]=1;
50 par[v]=u;
51 EnQ(v);
52 if (v==vtx){//搜索到最短路径时返回
53 flag=1;
54 break;
55 }
56 }
57 }
58 color[u]=2;
59 }
60 return flag;
61 }
62
63 int Ford_Fulkerson(int s, int t)
64 {
65 int max, min, v;
66 max=0;
67 while (BFSSearchPath()){
68 min=10000001;
69 v=vtx;
70 //求最短路径上的剩余流量
71 while (v!=1){
72 if (map[par[v]][v]<min){
73 min=map[par[v]][v];
74 }
75 v=par[v];
76 }
77 //根据剩余流量求剩余网络
78 v=vtx;
79 while (v!=1){
80 map[par[v]][v]-=min;
81 map[v][par[v]]+=min;
82 v=par[v];
83 }
84 max+=min;
85 }
86 return max;
87 }
88 int main()
89 {
90 int s, e, c, maxflow;
91 int i;
92 //freopen("input.txt", "r", stdin);
93 while (cin>>eg>>vtx){
94 memset(map, 0, sizeof(map));
95 for (i=0;i<eg;i++){
96 cin>>s>>e>>c;
97 map[s][e]+=c;//两点间可能有多条路径,把权值相加
98 }
99 maxflow=Ford_Fulkerson(1, vtx);
100 cout<<maxflow<<endl;
101 }
102 return 0;
103 }
1 #include <iostream>
2 #define SIZE 201
3 using namespace std;
4
5 int eg, vtx;
6 int map[SIZE][SIZE]; //图的邻接矩阵
7 //FIFO queue============================================
8 struct QUEUE{
9 int queue[SIZE];
10 int head;
11 int tail;
12 };
13 struct QUEUE q;
14 int color[SIZE], par[SIZE];
15
16 int InitQ(){
17 q.head=q.tail=0;
18 return 1;
19 }
20 int EnQ(int x){
21 q.queue[q.tail]=x;
22 q.tail++;
23 return 1;
24 }
25 int DeQ(){
26 int x;
27 x=q.queue[q.head];
28 q.head++;
29 return x;
30 }
31 //=====================================================
32
33 int BFSSearchPath()
34 {
35 int i, u, v, flag;
36 flag=0;
37 InitQ();
38 for (i=2;i<=vtx;i++){
39 color[i]=0;
40 par[i]=-1;
41 }
42 color[1]=1;
43 par[1]=-1;
44 EnQ(1);
45 while (q.head!=q.tail && !flag){
46 u=DeQ();
47 for (v=1;v<=vtx;v++){
48 if (map[u][v]!=0 && color[v]==0){
49 color[v]=1;
50 par[v]=u;
51 EnQ(v);
52 if (v==vtx){//搜索到最短路径时返回
53 flag=1;
54 break;
55 }
56 }
57 }
58 color[u]=2;
59 }
60 return flag;
61 }
62
63 int Ford_Fulkerson(int s, int t)
64 {
65 int max, min, v;
66 max=0;
67 while (BFSSearchPath()){
68 min=10000001;
69 v=vtx;
70 //求最短路径上的剩余流量
71 while (v!=1){
72 if (map[par[v]][v]<min){
73 min=map[par[v]][v];
74 }
75 v=par[v];
76 }
77 //根据剩余流量求剩余网络
78 v=vtx;
79 while (v!=1){
80 map[par[v]][v]-=min;
81 map[v][par[v]]+=min;
82 v=par[v];
83 }
84 max+=min;
85 }
86 return max;
87 }
88 int main()
89 {
90 int s, e, c, maxflow;
91 int i;
92 //freopen("input.txt", "r", stdin);
93 while (cin>>eg>>vtx){
94 memset(map, 0, sizeof(map));
95 for (i=0;i<eg;i++){
96 cin>>s>>e>>c;
97 map[s][e]+=c;//两点间可能有多条路径,把权值相加
98 }
99 maxflow=Ford_Fulkerson(1, vtx);
100 cout<<maxflow<<endl;
101 }
102 return 0;
103 }