3504: [Cqoi2014]危桥
题目:
题解:
一开始觉得要跑四次网络流...但是想想好像两次?
st-->a1/b1 a2/b2-->ed
好像这样也OK?但是a1流b2或者b1流到a2怎么办?完了...又想错了。
问了一波zzz大佬,他说我没想错...
把b1和b2换过来再流一次的话...那原本a1流到b2的流量流到b1再流到a2那不就是相当于a1可以流到a2咯
每次跑完都看一下流量是不是等于an+bn就好啦。
代码:
1 #include2 #include 3 #include 4 #include 5 #include 6 #define inf 999999999 7 using namespace std; 8 struct node 9 { 10 int x,y,c,next,other; 11 }a[210000];int len,last[110]; 12 int n,a1,a2,an,b1,b2,bn,st,ed; 13 void ins(int x,int y,int c) 14 { 15 int k1,k2; 16 k1=++len; 17 a[len].x=x;a[len].y=y;a[len].c=c; 18 a[len].next=last[x];last[x]=len; 19 k2=++len; 20 a[len].x=y;a[len].y=x;a[len].c=0; 21 a[len].next=last[y];last[y]=len; 22 23 a[k1].other=k2; 24 a[k2].other=k1; 25 } 26 int list[210000],h[110],head,tail; 27 bool bt_h() 28 { 29 list[1]=st;head=1;tail=2; 30 memset(h,0,sizeof(h)); 31 h[st]=1; 32 while(head!=tail) 33 { 34 int x=list[head]; 35 for(int k=last[x];k;k=a[k].next) 36 { 37 int y=a[k].y; 38 if(a[k].c>0 && h[y]==0) 39 { 40 h[y]=h[x]+1; 41 list[tail++]=y; 42 } 43 } 44 head++; 45 } 46 if(h[ed]==0)return false; 47 return true; 48 } 49 int find_flow(int x,int flow) 50 { 51 if(x==ed)return flow; 52 int s=0,t; 53 for(int k=last[x];k;k=a[k].next) 54 { 55 int y=a[k].y; 56 if(h[y]==h[x]+1 && a[k].c>0 && s