标签:cond otherwise other memory book mem tput enter size
Time Limit: 2000MS | Memory Limit: 20000K | |
Total Submissions: 10614 | Accepted: 2945 |
Description
Input
Output
Sample Input
3 1 3 1 1 0 1 1 1 0 1 1
Sample Output
1 2
Source
还是无向图的点连通度,这次确定了S和T,但是要求输出字典序最小的方案,所以还是得枚举TAT...
我们发现,如果去掉最小割集合中的一条边,那么最大流一定减少了这条边的容量值...所以我们从小到大枚举点然后在图中删去这个点拆成的边,如果发现这个点对应的边是最小割中的边,那么就要把这个点永远删去,否则还要还原...
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 //by NeighThorn 6 #define inf 0x3f3f3f3f 7 using namespace std; 8 //大鹏一日同风起,扶摇直上九万里 9 10 const int maxn=400+5,maxm=5000*2+400*400*2+5; 11 12 int n,S,T,ans,cnt,hd[maxn],to[maxm],fl[maxm],nxt[maxm],pos[maxn],vis[maxn],mp[maxn][maxn]; 13 14 inline void add(int s,int x,int y){ 15 fl[cnt]=s;to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++; 16 fl[cnt]=0;to[cnt]=x;nxt[cnt]=hd[y];hd[y]=cnt++; 17 } 18 19 inline bool bfs(void){ 20 memset(pos,-1,sizeof(pos)); 21 int head=0,tail=0,q[maxn]; 22 q[0]=S,pos[S]=0; 23 while(head<=tail){ 24 int top=q[head++]; 25 for(int i=hd[top];i!=-1;i=nxt[i]) 26 if(pos[to[i]]==-1&&fl[i]) 27 pos[to[i]]=pos[top]+1,q[++tail]=to[i]; 28 } 29 return pos[T]!=-1; 30 } 31 32 inline int find(int v,int f){ 33 if(v==T) 34 return f; 35 int res=0,t; 36 for(int i=hd[v];i!=-1&&f>res;i=nxt[i]) 37 if(pos[to[i]]==pos[v]+1&&fl[i]) 38 t=find(to[i],min(fl[i],f-res)),fl[i]-=t,fl[i^1]+=t,res+=t; 39 if(!res) 40 pos[v]=-1; 41 return res; 42 } 43 44 inline int dinic(void){ 45 int res=0,t; 46 while(bfs()) 47 while(t=find(S,inf)) 48 res+=t; 49 return res; 50 } 51 52 signed main(void){ 53 memset(hd,-1,sizeof(hd)); 54 memset(vis,0,sizeof(vis)); 55 scanf("%d%d%d",&n,&S,&T);cnt=0; 56 for(int i=1;i<=n;i++) 57 for(int j=1;j<=n;j++) 58 scanf("%d",&mp[i][j]); 59 for(int i=1;i<=n;i++) 60 add(1,i,i+n); 61 for(int i=1;i<=n;i++) 62 for(int j=1;j<=n;j++) 63 if(i!=j&&mp[i][j]) 64 add(inf,i+n,j); 65 S+=n;ans=dinic(); 66 if(ans==inf){ 67 puts("NO ANSWER!"); 68 return 0; 69 } 70 printf("%d\n",ans); 71 for(int i=1;i<=n;i++) 72 if(i!=S&&i!=T){ 73 for(int j=0;j<cnt;j+=2) 74 fl[j]+=fl[j^1],fl[j^1]=0; 75 for(int j=0;j<cnt;j+=2) 76 if(to[j]==i+n&&to[j^1]==i) 77 fl[j]=0; 78 if(dinic()==ans-1) 79 ans--,vis[i]=1; 80 else 81 for(int j=0;j<cnt;j+=2) 82 if(to[j]==i+n&&to[j^1]==i) 83 fl[j]=1,fl[j^1]=0; 84 } 85 for(int i=1;i<=n;i++) 86 if(vis[i]) 87 printf("%d ",i); 88 puts(""); 89 return 0; 90 }//Cap ou pas cap. Cap.
By NeighThorn
标签:cond otherwise other memory book mem tput enter size
原文地址:http://www.cnblogs.com/neighthorn/p/6229895.html