1. 程式人生 > >POJ 3436 ACM Computer Factory(最大流+路徑輸出)

POJ 3436 ACM Computer Factory(最大流+路徑輸出)

push_back factory flow open clas 小時 compute 臺電腦 mat

http://poj.org/problem?id=3436

題意:

每臺計算機包含P個部件,當所有這些部件都準備齊全後,計算機就組裝完成了。計算機的生產過程通過N臺不同的機器來完成,每臺機器用它的性能(每小時組裝多少臺電腦)、輸入/輸出規格來描述。

輸入規格描述了機器在組裝計算機時哪些部件必須準備好了。輸入規格是由P個整數組成,每個整數代表一個部件,這些整數取值為0、1或2,其中0表示該部件不應該已經準備好了,1表示該部件必須已經準備好了,2表示該部件是否已經準備好了無關緊要。

輸出規格描述了該機器組裝的結果。輸出規格也是由P個整數組成,每個整數取值 為0或1,其中0代表該部件沒有生產好,1代表該部件生產好了。

輸出每單位時間內的最大產量和連接數量和路徑。

思路:
因為每臺機器都有一個產量,所以這裏拆點,容量為機器的產量。

對每臺機器進行檢驗,如果它的要求中不包含1,那麽它就和源點相連,說明這臺機器是可以最先開始組裝電腦的,如果它的輸出中全是1,說明這臺機器已經把電腦組裝好了,和匯點相連。

然後機器之間兩兩判斷,是否可以相連。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<cstdio>
  5 #include<sstream>
  6
#include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath> 10 #include<map> 11 #include<set> 12 using namespace std; 13 typedef long long ll; 14 typedef pair<int,int> pll; 15 const int INF = 0x3f3f3f3f; 16 const int maxn = 200
+ 5; 17 18 struct Edge 19 { 20 int from,to,cap,flow; 21 Edge(int u,int v,int w,int f):from(u),to(v),cap(w),flow(f){} 22 }; 23 24 struct Dinic 25 { 26 int n,m,s,t; 27 vector<Edge> edges; 28 vector<int> G[maxn]; 29 bool vis[maxn]; 30 int cur[maxn]; 31 int d[maxn]; 32 33 void init(int n) 34 { 35 this->n=n; 36 for(int i=0;i<n;++i) G[i].clear(); 37 edges.clear(); 38 } 39 40 void AddEdge(int from,int to,int cap) 41 { 42 edges.push_back( Edge(from,to,cap,0) ); 43 edges.push_back( Edge(to,from,0,0) ); 44 m=edges.size(); 45 G[from].push_back(m-2); 46 G[to].push_back(m-1); 47 } 48 49 bool BFS() 50 { 51 queue<int> Q; 52 memset(vis,0,sizeof(vis)); 53 vis[s]=true; 54 d[s]=0; 55 Q.push(s); 56 while(!Q.empty()) 57 { 58 int x=Q.front(); Q.pop(); 59 for(int i=0;i<G[x].size();++i) 60 { 61 Edge& e=edges[G[x][i]]; 62 if(!vis[e.to] && e.cap>e.flow) 63 { 64 vis[e.to]=true; 65 d[e.to]=d[x]+1; 66 Q.push(e.to); 67 } 68 } 69 } 70 return vis[t]; 71 } 72 73 int DFS(int x,int a) 74 { 75 if(x==t || a==0) return a; 76 int flow=0, f; 77 for(int &i=cur[x];i<G[x].size();++i) 78 { 79 Edge &e=edges[G[x][i]]; 80 if(d[e.to]==d[x]+1 && (f=DFS(e.to,min(a,e.cap-e.flow) ) )>0) 81 { 82 e.flow +=f; 83 edges[G[x][i]^1].flow -=f; 84 flow +=f; 85 a -=f; 86 if(a==0) break; 87 } 88 } 89 return flow; 90 } 91 92 int Maxflow(int s,int t) 93 { 94 this->s=s; this->t=t; 95 int flow=0; 96 while(BFS()) 97 { 98 memset(cur,0,sizeof(cur)); 99 flow +=DFS(s,INF); 100 } 101 return flow; 102 } 103 }DC; 104 105 int p,n; 106 int w[maxn]; 107 int s[maxn][maxn]; 108 int d[maxn][maxn]; 109 110 bool isStart(int x) 111 { 112 for(int i=1;i<=p;i++) 113 if(s[x][i]==1) return false; 114 return true; 115 } 116 117 bool isEnd(int x) 118 { 119 for(int i=1;i<=p;i++) 120 { 121 if(d[x][i]==0) return false; 122 } 123 return true; 124 } 125 126 bool connect(int x, int y) 127 { 128 for(int i=1;i<=p;i++) 129 { 130 if((s[y][i]==1 && d[x][i]==0) ||(s[y][i]==0 && d[x][i]==1)) return false; 131 } 132 return true; 133 } 134 135 int main() 136 { 137 //freopen("in.txt","r",stdin); 138 while(~scanf("%d%d",&p,&n)) 139 { 140 int src=0, dst=2*n+1; 141 DC.init(dst+1); 142 143 for(int i=1;i<=n;i++) 144 { 145 scanf("%d",&w[i]); 146 147 for(int j=1;j<=p;j++) 148 scanf("%d",&s[i][j]); 149 for(int j=1;j<=p;j++) 150 scanf("%d",&d[i][j]); 151 152 if(isStart(i)) DC.AddEdge(src,i,INF); 153 if(isEnd(i)) DC.AddEdge(i+n,dst,INF); 154 } 155 156 for(int i=1;i<=n;i++) DC.AddEdge(i,i+n,w[i]); 157 158 for(int i=1;i<=n;i++) 159 { 160 for(int j=1;j<=n;j++) 161 { 162 if(i==j) continue; 163 if(connect(i,j)) DC.AddEdge(i+n,j,INF); 164 } 165 } 166 167 int ans=DC.Maxflow(src,dst); 168 169 int cnt=0; 170 for(int i=0;i<DC.edges.size();i++) 171 { 172 Edge& e=DC.edges[i]; 173 if(e.from==src || e.from==dst || e.to==src || e.to==dst) continue; 174 if((e.from+n)==e.to||(e.from-n)==e.to) continue; 175 if(e.flow<0) cnt++; 176 } 177 printf("%d %d\n",ans,cnt); 178 179 for(int i=0;i<DC.edges.size();i++) 180 { 181 Edge& e=DC.edges[i]; 182 if(e.from==src || e.from==dst || e.to==src || e.to==dst) continue; 183 if((e.from+n)==e.to||(e.from-n)==e.to) continue; 184 if(e.flow<0) 185 printf("%d %d %d\n",e.to-n,e.from,-e.flow); 186 } 187 } 188 return 0; 189 }

POJ 3436 ACM Computer Factory(最大流+路徑輸出)