网络流24题 洛谷 2763 试题库问题
Posted horsepower2001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络流24题 洛谷 2763 试题库问题相关的知识,希望对你有一定的参考价值。
代码风格迥异 ……
#include<bits/stdc++.h> const int N=1000+4,M=1000000+10,K=30+5; using namespace std; queue<int> q; int head[M],flt[M],nxt[M],to[M],cn=1; int ans[K][N],dis[N],num[K]; int n,k,x,tmp,src,sink,inf=1e8+7; bool vis[N]; int minx(int a,int b){ return a < b ? a : b ; } void create(int u,int v,int f){ cn++; to[cn]=v; flt[cn]=f; nxt[cn]=head[u]; head[u]=cn; cn++; to[cn]=u; flt[cn]=0; nxt[cn]=head[v]; head[v]=cn; } bool bfs(){ int v; memset(dis,0,sizeof(dis)); memset(vis,false,sizeof(vis)); q.push(src); vis[src]=true; while(!q.empty()){ tmp=q.front(); for(int i=head[tmp];i;i=nxt[i]){ v=to[i]; if(flt[i] && !vis[v]){ dis[v]=dis[tmp]+1; q.push(v); vis[v]=true; } } q.pop(); } return dis[sink]>0; } int dinic(int u,int delta){ if(u==sink) return delta; int res=0,v; for(int i=head[u];i && delta;i=nxt[i]){ v=to[i]; if(flt[i] && dis[v]==dis[u]+1){ int dd=dinic(v,minx(flt[i],delta)); flt[i]-=dd; delta-=dd; flt[i^1]+=dd; res+=dd; } } return res; } int main(){ ios::sync_with_stdio(false); cin>>k>>n; for(int i=1+n;i<=k+n;i++) cin>>num[i]; src=0;sink=k+n+1; for(int i=1;i<=n;i++) create(src,i,1); for(int i=1;i<=n;i++){ cin>>x; for(int j=1;j<=x;j++){ cin>>tmp; create(i,tmp+n,1); } } for(int i=n+1;i<=n+k;i++) create(i,sink,num[i]); while(bfs()) dinic(src,inf); for(int i=1;i<=n;i++){ for(int j=head[i];j;j=nxt[j]){ int v=to[j]; if(!flt[j]) ans[v][++ans[v][0]]=i; } } for(int i=1;i<=k;i++){ cout<<i<<": "; for(int j=1;j<=ans[i+n][0];j++) cout<<ans[i+n][j]<<" "; cout<<endl; } return 0; }
以上是关于网络流24题 洛谷 2763 试题库问题的主要内容,如果未能解决你的问题,请参考以下文章