计蒜之道 2016 复赛 F.菜鸟物流的运输网络

来源:互联网 发布:pe远程控制软件 编辑:程序博客网 时间:2024/04/29 09:05

考试时做的时间最长的一道题...


各种细节判定


换用网络流 T了一些..没跳出来 但大致思路都是对的!!

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int MAXN=100+10;const int MAXM=800*100+10;int tot=1,g[MAXN],nnext[MAXM],num[MAXM],ix[MAXM],iy[MAXM],flow[MAXM];void add(int x,int y,int z){//cout<<x<<' '<<y<<' '<<z<<endl;tot++;nnext[tot]=g[x];g[x]=tot;num[tot]=y;flow[tot]=z;ix[tot]=x;iy[tot]=y;}int team[MAXN],head,tail;bool used[MAXM];bool can[MAXN];int d[MAXN*2];int S,T,mid,s,t;int n,m;bool bfs(){memset(d,0,sizeof(d));head=tail=0;team[++tail]=S;d[S]=1;while(head<tail){int x=team[++head];//cout<<x<<"*"<<d[x]<<endl;for(int i=g[x];i;i=nnext[i]){int tmp=num[i];if(flow[i]>=1&&d[tmp]==0){d[tmp]=d[x]+1;team[++tail]=tmp;}}}//cout<<T<<endl;if(d[T]==0) return false;return true;}int dfs(int x,int mmin){if(x==T) return mmin;int tmp,f=0;for(int i=g[x];i;i=nnext[i])if(d[num[i]]==d[x]+1&&flow[i]>=1&&(tmp=dfs(num[i],min(mmin,flow[i])))){flow[i]-=tmp;flow[i^1]+=tmp;used[i]^=1;used[i^1]^=1;f+=tmp;mmin-=tmp;if(mmin==0) return f;}d[x]=0;return f;}void dfs_w(int x,int fa){if(x==mid+n) printf("%d ",mid) ;//cout<<'*'<<x<<endl;if(x!=t){if(x<=n) printf("%d ",x);}else{printf("%d\n",x);return ;}for(int i=g[x];i;i=nnext[i])if(used[i]&&num[i]!=T&&fa!=num[i]/*&can[num[i]]&&(flow[i]==c)*/){//cout<<"*"<<flow[i]<<' '<<flow[i^1]<<endl;dfs_w(num[i],x);return ;}}int main(){int TT;cin>>TT;while(TT--){tot=1;memset(g,0,sizeof(g));memset(used,false,sizeof(used));memset(can,false,sizeof(can));scanf("%d %d %d %d %d",&n,&m,&s,&t,&mid);for(int i=1;i<=n;i++) if(i!=mid) add(i,n+i,1),add(n+i,i,0);add(mid,mid+n,0);add(mid+n,mid,1);for(int x,y,i=1;i<=m;i++){scanf("%d %d",&x,&y);add(x+n,y,1);add(y,x+n,0);add(y+n,x,1);add(x,y+n,0);}T=2*n+1;S=mid+n;add(s+n,T,1);add(T,s+n,0);add(t+n,T,1);add(T,t+n,0);int sum=0;while(bfs()&&sum!=2) sum+=dfs(S,1);//cout<<sum<<endl;/*for(int i=1;i<=tot;i++)if(used[i]==true)/*cout<<ix[i]<<" "<<iy[i]<<endl,*//*can[ix[i]]=true,can[iy[i]]=true;*/dfs_w(s,0);}return 0;}


0 0