题目链接 : POJ1149
画出最初的模型,想办法化简。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <iostream> 6 #include <queue> 7 using namespace std; 8 #define next Next 9 const int inf = 0x3f3f3f3f; 10 const int maxn=205; 11 int level[maxn]; 12 int iter[maxn]; 13 int head[maxn],tot; 14 struct edge{ 15 int to,cap,Next; 16 } e[20005]; ///此处应为边的两倍,加一条容量为0的反向边 17 void init(){ 18 memset(head,-1,sizeof(head)); 19 tot=0; 20 } 21 void add(int from,int to,int cap){ 22 e[tot].Next=head[from]; 23 e[tot].to=to; 24 e[tot].cap=cap; 25 head[from]=tot; 26 tot++; 27 } 28 void addedge(int from,int to,int cap){ 29 add(from,to,cap); 30 add(to,from,0); 31 } 32 void bfs(int s){ 33 memset(level,-1,sizeof(level)); 34 queue<int> q; 35 level[s]=0; 36 q.push(s); 37 while(!q.empty()){ 38 int v=q.front(); q.pop(); 39 for(int i=head[v];~i;i=e[i].Next){ 40 edge &ed=e[i]; 41 if(ed.cap>0&&level[ed.to]<0){ 42 level[ed.to]=level[v]+1; 43 q.push(ed.to); 44 } 45 } 46 } 47 } 48 int dfs(int v,int t,int f){ 49 if(v==t) return f; 50 for(int &i=iter[v];~i;i=e[i].Next){ 51 edge &ed=e[i]; 52 if(ed.cap>0&&level[v]<level[ed.to]){ 53 int d=dfs(ed.to,t,min(f,ed.cap)); 54 if(d>0){ 55 ed.cap-=d; 56 e[i^1].cap+=d; 57 return d; 58 } 59 } 60 } 61 return 0; 62 } 63 int max_flow(int s,int t){ 64 int flow=0; 65 while(1){ 66 bfs(s); 67 if(level[t]<0) return flow; 68 memcpy(iter,head,sizeof(iter)); 69 int f; 70 while((f=dfs(s,t,inf))>0){ 71 flow+=f; 72 } 73 } 74 } 75 76 vector<int> customer[1005]; 77 int pig[1005]; 78 int main() 79 { 80 int n,m; 81 init(); 82 scanf("%d %d",&m,&n); 83 int s = n+1; 84 int t = n+2; 85 for(int i=1;i<=m;i++) scanf("%d",&pig[i]); 86 for(int i=1;i<=n;i++) 87 { 88 int a,x,b; 89 scanf("%d",&a); 90 for(int j=1;j<=a;j++) 91 { 92 scanf("%d",&x); 93 customer[x].push_back(i); 94 } 95 scanf("%d",&b); 96 addedge(i,t,b); 97 } 98 for(int i=1;i<=m;i++) 99 { 100 int tt = customer[i].size(); 101 for(int j=0;j<tt;j++) 102 { 103 if(j==0) 104 { 105 addedge(s,customer[i][0],pig[i]); 106 } 107 if(j+1<tt) 108 addedge(customer[i][j],customer[i][j+1],inf); 109 } 110 } 111 int ans = max_flow(s,t); 112 printf("%d ",ans); 113 return 0; 114 }