BZOJ 3504 危橋(網路流)

2021-08-18 02:28:54 字數 1233 閱讀 6348

題目大意:n(n<=50)座島,互相之間有或者沒有雙向邊相連,有的邊可以走兩次,有的可以走無限次,問是否可以從a1~a2往返an次、從b1~b2往返bn次。

題解:最大流,建圖比較顯然,用流量限制邊走的次數。因為是雙向邊,往返就是走兩次。所以,s向a1、b1連邊,a2、b2向t連邊,邊權為2an、2bn,判斷s是否滿流。只是需要注意一下,還要重新建圖,s改向a1、b2連邊,t改向a2,b1連邊,再求一次最大流,避免a1走到b2之類的情況。兩遍都滿流才合法。

code(新學了當前弧優化(⊙^⊙))

#include

#include

#include

#include

#include

#include

#define inf 1000000000

using namespace std;

inline int

read()

while (c<='9'&&c>='0')

return num*f;

}struct edgee[100005];

int n,a1,a2,b1,b2,an,bn;

int tot=1,head[205],last[205],s,t,ans,height[205];

char s[55][55];

void push(int

x,int

y,int v)

bool bfs()}}

return height[t]!=-1;

}int dfs(int now,int flow)

}if (!used) height[now]=-1;

return used;

}int main()

}ans=0;

while (bfs())

if (ans!=an*2+bn*2)

tot=1; memset(head,0,sizeof(head));

push(s,a1,an*2),push(a2,t,an*2);

push(s,b2,bn*2),push(b1,t,bn*2);

for (int i=1;i<=n;i++)

}ans=0;

while (bfs())

if (ans!=an*2+bn*2)

printf("yes\n");

}return

0;}

BZOJ3504 危橋(網路流)

bzoj 洛谷alice和bob居住在乙個由n座島嶼組成的國家,島嶼被編號為0到n 1。某些島嶼之間有橋相連,橋上的道路是雙 向的,但一次只能供一人通行。其中一些橋由於年久失修成為危橋,最多只能通行兩次。alice希望在島嶼al和a2之間往返an次 從al到a2再從a2到al算一次往返 同時,bob...

BZOJ3504 CQOI2014危橋 最大流

源向a1和b1連流量為2 an,2 bn的邊,a2和b2向匯連流量為2 an,2 bn的邊,其他邊非危橋連inf,危橋連2的邊,跑最大流,但是這時滿流不一定有解,因為可能有a1流到b2的流這樣,所以把b1,b2反過來重構圖再跑一次最大流,若能滿流則有解。證明 假設第一次a1流了x的流到b2,第二次的...

BZOJ3504 CQOI2014危橋(最大流)

如果只有乙個人的話很容易想到最大流,正常橋連限流inf雙向邊,危橋連限流2雙向邊即可。現在有兩個人,容易想到給兩起點建超源兩匯點建超匯,但這樣沒法保證兩個人各自到達自己要去的目的地。於是再超源連乙個人的起點和另乙個人的終點跑一遍,兩次都滿流說明有解。證明腦 bu 補 hui include incl...