poj3436 ACM Computer Factory (最大流)
最大流的问题主要的难度一般在构图上,这题可以这样构图:源点指向input中没有1(即为0或2)的machine,output全为1的machine指向汇点,machine1与machine2相连的条件为machine1的output与machine2的input之和不等于1(即组合为00,11, 21或20,但不能是01)。
以下是EK算法的实现:
以下是EK算法的实现:
Code
1 /*======================================
2 Type :Maximum flow
3 Method:Edmonds and Karp(EK)
4 Status:AC
5 Time :16MS
6 Memory:156K
7 Length:2682B
8 Remark:
9 ======================================*/
10 #include <iostream>
11 #include <list>
12 #define GSIZE 55
13 #define INF 100000000
14 using namespace std;
15 struct MACHINE{
16 int in[15];
17 int out[15];
18 int pfms;
19 };
20 struct NODE{
21 int color;
22 int pre;
23 };
24 struct NODE nd[GSIZE];
25 struct MACHINE mac[GSIZE];
26 int n, p, src, sink;
27 int resflow[GSIZE][GSIZE];
28 int BFS()
29 {
30 int i, u, v, flag;
31 list<int> l;
32 flag=0;
33 for (i=1;i<=sink;i++){
34 nd[i].color=0;
35 nd[i].pre=-1;
36 }
37 nd[src].color=1;
38 nd[src].pre=-1;
39 l.push_back(src);
40 while (!l.empty()){
41 u=l.back();
42 l.pop_back();
43 for (v=0;v<=sink;v++){
44 if (resflow[u][v] && !nd[v].color){
45 nd[v].color=1;
46 nd[v].pre=u;
47 l.push_back(v);
48 if (v==sink){//搜索到最短路径时返回
49 flag=1;
50 break;
51 }
52 }
53 }
54 nd[u].color=2;
55 }
56 return flag;
57 }
58 int EK()
59 {
60 struct PATH{
61 int x, y, w;
62 };
63 int i, maxflow, v, capflow, pnum;
64 struct PATH path[GSIZE];
65 maxflow=0;
66 pnum=0;
67 while(BFS()){
68 v=sink;
69 capflow=INF;
70 while(v!=src){
71 if (resflow[nd[v].pre][v]<capflow)
72 capflow=resflow[nd[v].pre][v];
73 v=nd[v].pre;
74 }
75 v=sink;
76 while (v!=src){
77 resflow[nd[v].pre][v]-=capflow;
78 resflow[v][nd[v].pre]+=capflow;
79 if (v!=sink && nd[v].pre!=src){
80 path[pnum].x=nd[v].pre;
81 path[pnum].y=v;
82 path[pnum].w=capflow;
83 pnum++;
84 }
85 v=nd[v].pre;
86 }
87 maxflow+=capflow;
88 }
89 //output
90 printf("%d %d\n", maxflow, pnum);
91 for (i=0;i<pnum;i++)
92 printf("%d %d %d\n", path[i].x, path[i].y, path[i].w);
93 return maxflow;
94 }
95 int main()
96 {
97 int i, j, flag, k, maxflow;
98 //freopen("input.txt", "r", stdin);
99 src=0;
100 scanf("%d %d", &p, &n);
101 //memset(resflow, 0, sizeof(resflow));
102 sink=n+1;
103 for (i=1;i<=n;i++){
104 scanf("%d", &mac[i].pfms);
105 for (j=0;j<p;j++)
106 scanf("%d", &(mac[i].in[j]));
107 for (j=0;j<p;j++)
108 scanf("%d", &(mac[i].out[j]));
109 }
110 for (i=1;i<=n;i++){
111 for (j=1;j<=n;j++){
112 flag=0;
113 if (i!=j){
114 for (k=0;k<p;k++){
115 if (mac[j].in[k]+mac[i].out[k]==1){
116 flag=1;
117 break;
118 }
119 }
120 if (flag==0)
121 resflow[i][j]=(mac[i].pfms<mac[j].pfms)?mac[i].pfms:mac[j].pfms;
122 }
123 }
124 }
125 for (i=1;i<=n;i++){
126 flag=0;
127 for (j=0;j<p;j++){
128 if (mac[i].in[j]==1){
129 flag=1;
130 break;
131 }
132 }
133 if (flag==0)
134 resflow[src][i]=mac[i].pfms;
135 }
136 for (i=1;i<=n;i++){
137 flag=0;
138 for (j=0;j<p;j++){
139 if (mac[i].out[j]!=1){
140 flag=1;
141 break;
142 }
143 }
144 if (flag==0)
145 resflow[i][sink]=mac[i].pfms;
146 }
147 maxflow=EK();
148 return 0;
149 }
1 /*======================================
2 Type :Maximum flow
3 Method:Edmonds and Karp(EK)
4 Status:AC
5 Time :16MS
6 Memory:156K
7 Length:2682B
8 Remark:
9 ======================================*/
10 #include <iostream>
11 #include <list>
12 #define GSIZE 55
13 #define INF 100000000
14 using namespace std;
15 struct MACHINE{
16 int in[15];
17 int out[15];
18 int pfms;
19 };
20 struct NODE{
21 int color;
22 int pre;
23 };
24 struct NODE nd[GSIZE];
25 struct MACHINE mac[GSIZE];
26 int n, p, src, sink;
27 int resflow[GSIZE][GSIZE];
28 int BFS()
29 {
30 int i, u, v, flag;
31 list<int> l;
32 flag=0;
33 for (i=1;i<=sink;i++){
34 nd[i].color=0;
35 nd[i].pre=-1;
36 }
37 nd[src].color=1;
38 nd[src].pre=-1;
39 l.push_back(src);
40 while (!l.empty()){
41 u=l.back();
42 l.pop_back();
43 for (v=0;v<=sink;v++){
44 if (resflow[u][v] && !nd[v].color){
45 nd[v].color=1;
46 nd[v].pre=u;
47 l.push_back(v);
48 if (v==sink){//搜索到最短路径时返回
49 flag=1;
50 break;
51 }
52 }
53 }
54 nd[u].color=2;
55 }
56 return flag;
57 }
58 int EK()
59 {
60 struct PATH{
61 int x, y, w;
62 };
63 int i, maxflow, v, capflow, pnum;
64 struct PATH path[GSIZE];
65 maxflow=0;
66 pnum=0;
67 while(BFS()){
68 v=sink;
69 capflow=INF;
70 while(v!=src){
71 if (resflow[nd[v].pre][v]<capflow)
72 capflow=resflow[nd[v].pre][v];
73 v=nd[v].pre;
74 }
75 v=sink;
76 while (v!=src){
77 resflow[nd[v].pre][v]-=capflow;
78 resflow[v][nd[v].pre]+=capflow;
79 if (v!=sink && nd[v].pre!=src){
80 path[pnum].x=nd[v].pre;
81 path[pnum].y=v;
82 path[pnum].w=capflow;
83 pnum++;
84 }
85 v=nd[v].pre;
86 }
87 maxflow+=capflow;
88 }
89 //output
90 printf("%d %d\n", maxflow, pnum);
91 for (i=0;i<pnum;i++)
92 printf("%d %d %d\n", path[i].x, path[i].y, path[i].w);
93 return maxflow;
94 }
95 int main()
96 {
97 int i, j, flag, k, maxflow;
98 //freopen("input.txt", "r", stdin);
99 src=0;
100 scanf("%d %d", &p, &n);
101 //memset(resflow, 0, sizeof(resflow));
102 sink=n+1;
103 for (i=1;i<=n;i++){
104 scanf("%d", &mac[i].pfms);
105 for (j=0;j<p;j++)
106 scanf("%d", &(mac[i].in[j]));
107 for (j=0;j<p;j++)
108 scanf("%d", &(mac[i].out[j]));
109 }
110 for (i=1;i<=n;i++){
111 for (j=1;j<=n;j++){
112 flag=0;
113 if (i!=j){
114 for (k=0;k<p;k++){
115 if (mac[j].in[k]+mac[i].out[k]==1){
116 flag=1;
117 break;
118 }
119 }
120 if (flag==0)
121 resflow[i][j]=(mac[i].pfms<mac[j].pfms)?mac[i].pfms:mac[j].pfms;
122 }
123 }
124 }
125 for (i=1;i<=n;i++){
126 flag=0;
127 for (j=0;j<p;j++){
128 if (mac[i].in[j]==1){
129 flag=1;
130 break;
131 }
132 }
133 if (flag==0)
134 resflow[src][i]=mac[i].pfms;
135 }
136 for (i=1;i<=n;i++){
137 flag=0;
138 for (j=0;j<p;j++){
139 if (mac[i].out[j]!=1){
140 flag=1;
141 break;
142 }
143 }
144 if (flag==0)
145 resflow[i][sink]=mac[i].pfms;
146 }
147 maxflow=EK();
148 return 0;
149 }