http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html 以上内容均为转载
#include<queue> #include<vector> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=160; const int INF=99999999; vector<int>G[1008]; bool mp[N][N],used[1008]; int tot,head[N],dis[N],st,ed,val[1007],sum[N]; struct node{ int to,next,w; }e[N*N*3]; void init(){ tot=0; memset(head,-1,sizeof(head)); } void add(int u,int v,int w){ e[tot].to=v; e[tot].w=w; e[tot].next=head[u]; head[u]=tot++; } bool bfs(){ memset(dis,-1,sizeof(dis)); queue<int>Q; Q.push(st); dis[st]=0; while(!Q.empty()){ int u=Q.front(); Q.pop(); for(int i=head[u];i+1;i=e[i].next){ int v=e[i].to; if(dis[v]==-1&&e[i].w>0){ dis[v]=dis[u]+1; if(v==ed) return true; Q.push(v); } } } return false; } int dfs(int s,int low){ if(s==ed||low==0) return low; int ans=low,a; for(int i=head[s];i+1;i=e[i].next){ int v=e[i].to; if(dis[v]==dis[s]+1&&e[i].w>0&&(a=dfs(v,min(ans,e[i].w)))){ ans-=a; e[i].w-=a; e[i^1].w+=a; if(!ans) return low; } } if(low==ans) dis[s]=-1; return low-ans; } int main(){ int n,m,x,num; while(scanf("%d%d",&n,&m)!=EOF){ st=0;ed=m+1; memset(sum,0,sizeof(sum)); for(int i=0;i<=n;++i) G[i].clear(); for(int i=1;i<=n;++i) scanf("%d",val+i); memset(used,0,sizeof(used)); init(); for(int i=1;i<=m;++i) { scanf("%d",&num); while(num--){ scanf("%d",&x); if(!used[x]) {used[x]=1;sum[i]+=val[x];} G[x].push_back(i); } scanf("%d",&x); add(i,ed,x); add(ed,i,0); } memset(mp,0,sizeof(mp)); for(int i=1;i<=n;++i){ for(int j=0;j<(int)G[i].size();++j){ if(!j&&!mp[0][G[i][j]]) { mp[G[i][j]][0]=mp[0][G[i][j]]=1; add(0,G[i][j],sum[G[i][j]]); add(G[i][j],0,0); } else if(!mp[G[i][0]][G[i][j]]) { add(G[i][0],G[i][j],INF); add(G[i][j],G[i][0],0); mp[G[i][0]][G[i][j]]=1; } } } int ans=0; while(bfs()) ans+=dfs(0,INF); printf("%d\n",ans); } }