Poj 1149 PIGS
题解:有M个猪圈。有N个游客,每个游客想买一定数量的猪,并且有一些猪圈的钥匙。每一个顾客走之后,他打开的猪圈的猪可以分配到其它已打开的猪圈中。求最多能卖出多少猪。
题解:参考博文:http://www.cnblogs.com/sleeper-qp/archive/2012/07/23/2605253.html
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cmath> 6 #include <string> 7 #include <vector> 8 #include <list> 9 #include <map> 10 #include <queue> 11 #include <stack> 12 #include <bitset> 13 #include <algorithm> 14 #include <numeric> 15 #include <functional> 16 #include <set> 17 #include <fstream> 18 19 using namespace std; 20 21 const int INF=0x3f3f3f3f; 22 const int maxm=1010; 23 const int maxn=110; 24 25 int N,M; 26 int customer[maxm][maxn]; 27 int cusnum[maxm]; 28 int pighouse[maxm]; 29 int B[maxn]; 30 struct edge{ 31 int u,v,cap,next; 32 }G[maxn*maxm]; 33 int head[maxn*maxm],pre[maxn*maxm],level[maxn*maxm]; 34 int num[maxn*maxm],cur[maxn*maxm]; 35 int idx; 36 int s,t,tt; 37 38 void build(int u,int v,int cap) 39 { 40 G[idx].v=v; 41 G[idx].cap=cap; 42 G[idx].next=head[u]; 43 head[u]=idx++; 44 } 45 46 void add_edge(int u,int v,int cap) 47 { 48 build(u,v,cap); 49 build(v,u,0); 50 } 51 52 void bfs() 53 { 54 memset(level,-1,sizeof(level)); 55 memset(num,0,sizeof(num)); 56 queue<int> q; 57 q.push(t); 58 level[t]=0; 59 num[0]=1; 60 while(!q.empty()) 61 { 62 int u=q.front(); 63 q.pop(); 64 for(int i=head[u];i!=-1;i=G[i].next) 65 { 66 int v=G[i].v; 67 if(level[v]==-1){ 68 level[v]=level[u]+1; 69 num[level[v]]++; 70 q.push(v); 71 } 72 } 73 } 74 } 75 76 void ISAP() 77 { 78 memcpy(cur,head,sizeof(cur)); 79 bfs(); 80 int flow=0; 81 int u=pre[s]=s; 82 while(level[s]<tt) 83 { 84 if(u==t){ 85 int f=INF,pos; 86 for(int i=s;i!=t;i=G[cur[i]].v) 87 { 88 if(f>G[cur[i]].cap){ 89 f=G[cur[i]].cap; 90 pos=i; 91 } 92 } 93 for(int i=s;i!=t;i=G[cur[i]].v) 94 { 95 G[cur[i]].cap-=f; 96 G[cur[i]^1].cap+=f; 97 } 98 flow+=f; 99 u=pos; 100 } 101 int k; 102 for(k=cur[u];k!=-1;k=G[k].next) 103 { 104 if(level[G[k].v]+1==level[u]&&G[k].cap) break; 105 } 106 if(k!=-1){ 107 cur[u]=k; 108 pre[G[k].v]=u; 109 u=G[k].v; 110 }else{ 111 if(--num[level[u]]==0) break; 112 int mind=tt; 113 for(int i=head[u];i!=-1;i=G[i].next) 114 { 115 if(mind>level[G[i].v]&&G[i].cap){ 116 mind=level[G[i].v]; 117 cur[u]=i; 118 } 119 } 120 level[u]=mind+1; 121 num[level[u]]++; 122 u=pre[u]; 123 } 124 } 125 printf("%d\n",flow); 126 } 127 128 void init() 129 { 130 memset(cusnum,0,sizeof(cusnum)); 131 memset(head,-1,sizeof(head)); 132 // memset(timec,0,sizeof(timec)); 133 s=0; 134 t=N+1; 135 tt=t+1; 136 idx=0; 137 } 138 139 void build_graph() 140 { 141 for(int i=1;i<=N;i++) 142 { 143 add_edge(i,t,B[i]); 144 } 145 for(int i=1;i<=M;i++) 146 { 147 if(cusnum[i]>0){ 148 add_edge(s,customer[i][0],pighouse[i]); 149 } 150 for(int j=1;j<cusnum[i];j++) 151 { 152 add_edge(customer[i][j-1],customer[i][j],INF); 153 } 154 } 155 } 156 157 int main() 158 { 159 // freopen("/Users/apple/Desktop/暑假/POJ 1149 PIGS/POJ 1149 PIGS/in","r",stdin); 160 while(scanf("%d%d",&M,&N)!=EOF) 161 { 162 init(); 163 for(int i=1;i<=M;i++) 164 { 165 scanf("%d",&pighouse[i]); 166 } 167 for(int i=1;i<=N;i++) 168 { 169 int A,key; 170 scanf("%d",&A); 171 for(int j=1;j<=A;j++) 172 { 173 scanf("%d",&key); 174 customer[key][cusnum[key]++]=i; 175 } 176 scanf("%d",&B[i]); 177 } 178 // puts("YES"); 179 build_graph(); 180 // puts("YES"); 181 ISAP(); 182 // puts("YES"); 183 } 184 return 0; 185 }