usaco Telecowmunication(网络流)

来源:互联网 发布:java 编写的程序实例 编辑:程序博客网 时间:2024/06/14 10:34

这题跟前面一题很像吧就是建图有点麻烦。

注意最后源点和汇点的选择一定得是2*a和2*b-1不然就是错的。

/*ID:jinbo wuTASK:telecowLANG:C++*/#include<bits/stdc++.h>using namespace std;#define inf 100000000struct node{int c,f;}g[220][220];int ans[220];int n,m,a,b;int level[220];int cnt;void init(){for(int i=1;i<=2*n;i++){for(int j=1;j<=2*n;j++)g[i][j].f=0;}}bool bfs(){queue<int> q;memset(level,0,sizeof(level));q.push(2*a);level[2*a]=1;int  u,v;while(!q.empty()){u=q.front();q.pop();for(int v=1;v<=2*n;v++){if(!level[v]&&g[u][v].c>g[u][v].f){level[v]=level[u]+1;q.push(v);}}}return level[2*b-1]!=0;}int dfs(int u,int cp){int tmp=cp;int v,t;if(u==2*b-1)return cp;for(v=1;v<=2*n&&tmp;v++){if(level[u]+1==level[v]){if(g[u][v].c>g[u][v].f){t=dfs(v,min(tmp,g[u][v].c-g[u][v].f));g[u][v].f+=t;g[v][u].f-=t;tmp-=t;}} }return cp-tmp;}int dinic(){int sum,tf;sum=tf=0;while(bfs()){while(tf=dfs(a*2,inf)){sum=sum+tf;}} return sum;}int main(){freopen("telecow.in","r",stdin);freopen("telecow.out","w",stdout);int x,y;cin>>n>>m>>a>>b;for(int i=1;i<=m;i++){cin>>x>>y;g[x*2-1][x*2].c=1;g[y*2-1][y*2].c=1;g[x*2][y*2-1].c=inf;g[y*2][x*2-1].c=inf; }int s=dinic();int f=s;int l=0;for(int i=1;i<=n;i++){if(i==a||i==b)continue;init();g[i*2-1][i*2].c=0;if(dinic()+1==s){ ans[l++]=i; cnt++; s--;  if(cnt==f) break;     } else g[i*2-1][i*2].c=1;}cout<<l<<endl;for(int i=0;i<l-1;i++){cout<<ans[i]<<" "; }cout<<ans[l-1]<<endl; }


0 0
原创粉丝点击