標籤:os io for 問題 代碼 演算法 amp size
/*EK演算法版本的,比較慢哦。。。。。詳見下面dinic版本-----------------------------------------題目是網路流最大流的問題----------------------------------------建圖:關鍵:拆點把每個牛拆成兩個點,牛作為一個點有流量限制,即每一頭牛隻能的一份飯。把牛拆開後,將邊的權值賦值為1,----------------------------------------建好圖後就可以EK演算法最大流了----------------------------------------建圖代碼:for(int i=1; i<=f; i++)源點和food相連 g[s][i] = 1;for(int i=1; i<=d; i++)drink和匯點相連 g[i + 2*n + f][t] = 1;for(int i=1; i<=n; i++){ cin>>a>>b; for(int j=1; j<=a; j++) { cin>>food; g[food][f + i] = 1;food和牛相連 } g[f + i][f + i + n] = 1;牛拆點後也要相連 for(int j=1; j<=b; j++) { cin>>drink; g[f + i + n][2*n + f + drink] = 1;牛和drink相連 }}---------------------------------*/#include <iostream>#include <cstdio>#include <queue>#include <cstring>#define INF 0x3f3f3f3fusing namespace std;const int N = 500;int n,f,d;int g[N][N];int flow[N][N],a[N],p[N];int s,t;int EK(int s, int t){ queue<int> q; int f = 0; for(;;) { memset(a,0,sizeof(a)); a[s] = INF; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); for(int v=s; v<=t; v++) { if(!a[v] && g[u][v] > flow[u][v]) { p[v] = u; q.push(v); a[v] = min(a[u],g[u][v] - flow[u][v]); } } } if(a[t] == 0) break; for(int u=t; u != s; u=p[u]) { flow[p[u]][u] += a[t]; flow[u][p[u]] -= a[t]; } f += a[t]; } return f;}void init(){ int a,b,food,drink; s = 0; t = 2*n + f + d + 1; memset(g,0,sizeof(g)); for(int i=1; i<=f; i++) g[s][i] = 1; for(int i=1; i<=d; i++) g[i + 2*n + f][t] = 1; for(int i=1; i<=n; i++) { cin>>a>>b; for(int j=1; j<=a; j++) { cin>>food; g[food][f + i] = 1; } g[f + i][f + i + n] = 1; for(int j=1; j<=b; j++) { cin>>drink; g[f + i + n][2*n + f + drink] = 1; } }}int main(){ //freopen("input.txt","r",stdin); while(scanf("%d%d%d",&n,&f,&d) != EOF) { init(); printf("%d\n",EK(s, t)); } return 0;}
--------------------------------------------------------------------
戰鬥,毫不退縮;奮鬥,永不停歇~~~~~~~~~~~~~~