标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 20253 | Accepted: 9252 |
Description
Input
Output
Sample Input
3 3 3 1 10 2 1 2 2 2 1 3 3 1 2 6
Sample Output
7
DINIC练习,题目的建图值的注意!
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<queue> 5 #include<vector> 6 7 using namespace std; 8 const int inf=0x7fffffff; 9 int n,m; 10 int map[110][110]; 11 int house[1010]; 12 int fir[1010]={0}; 13 int lays[110]; 14 bool vis[110]={0}; 15 bool bfs() 16 { 17 memset(lays,-1,sizeof(lays)); 18 queue<int>q; 19 lays[0]=0; 20 q.push(0); 21 while(!q.empty()) 22 { 23 int u=q.front();q.pop(); 24 for(int i=1;i<=n+1;i++) 25 if(map[u][i]>0&&lays[i]==-1) 26 { 27 lays[i]=lays[u]+1; 28 if(i==n+1)return 1; 29 else q.push(i); 30 } 31 } 32 return 0; 33 } 34 int dinic() 35 { 36 int maxf=0; 37 vector<int>q; 38 while(bfs()) 39 { 40 memset(vis,0,sizeof(vis)); 41 q.push_back(0); 42 vis[0]=1; 43 while(!q.empty()) 44 { 45 int nd=q.back(); 46 if(nd==n+1) 47 { 48 int minn,minx=0x7fffffff; 49 for(int i=1;i<q.size();i++) 50 { 51 int u=q[i-1],v=q[i]; 52 if(map[u][v]<minx) 53 { 54 minx=map[u][v]; 55 minn=u; 56 } 57 } 58 maxf+=minx; 59 for(int i=1;i<q.size();i++) 60 { 61 int u=q[i-1],v=q[i]; 62 map[u][v]-=minx; 63 map[v][u]+=minx; 64 } 65 while(!q.empty()&&q.back()!=minn) 66 { 67 vis[q.back()]=0; 68 q.pop_back(); 69 } 70 } 71 else 72 { 73 int i; 74 for(i=0;i<=n+1;i++) 75 { 76 if(map[nd][i]>0&&lays[i]==lays[nd]+1&&!vis[i]) 77 { 78 q.push_back(i); 79 vis[i]=1; 80 break; 81 } 82 } 83 if(i>n+1)q.pop_back(); 84 } 85 } 86 } 87 return maxf; 88 } 89 int main() 90 { 91 cin>>m>>n; 92 for(int i=1;i<=m;i++) 93 scanf("%d",house+i); 94 for(int i=1;i<=n;i++) 95 { 96 int keys; 97 scanf("%d",&keys); 98 for(int j=0;j<keys;j++) 99 { 100 int keyn; 101 scanf("%d",&keyn); 102 if(fir[keyn]==0)map[0][i]+=house[keyn]; 103 else map[fir[keyn]][i]=inf; 104 fir[keyn]=i; 105 } 106 int pigs; 107 scanf("%d",&pigs); 108 map[i][n+1]=pigs; 109 } 110 cout<<dinic()<<endl; 111 return 0; 112 }
标签:
原文地址:http://www.cnblogs.com/gryzy/p/5865294.html