BZOJ3504 危橋(網路流)

2022-03-20 06:53:51 字數 2043 閱讀 7184

bzoj

洛谷alice和bob居住在乙個由n座島嶼組成的國家,島嶼被編號為0到n-1。某些島嶼之間有橋相連,橋上的道路是雙

向的,但一次只能供一人通行。其中一些橋由於年久失修成為危橋,最多只能通行兩次。alice希望在島嶼al和a2之間往返an次(從al到a2再從a2到al算一次往返)。同時,bob希望在島嶼bl和b2之間往返bn次。這個過程中,所有危橋最多通行兩次,其餘的橋可以無限次通行。請問alice和bob能完成他們的願望嗎?

本題有多組測試資料。

每組資料第一行包含7個空格隔開的整數,分別為n、al、a2、an、bl、b2、bn。

接下來是乙個n行n列的對稱矩陣,由大寫字母組成。矩陣的i行j列描述編號i一1和j-l的島嶼間的連線情況,若為「o」則表示有危橋相連:為「n」表示有普通的橋相連:為「x」表示沒有橋相連。

|對於每組測試資料輸出一行,如果他們都能完成願望輸出「yes」,否則輸出「no」。

4 0 1 1 2 3 1

xoxx

oxox

xoxo

xxox

4 0 2 1 1 3 2

xnxo

nxox

xoxo

oxox

yesno

4<=n<50

o<=a1, a2, b1, b2<=n-1

1 <=an. b<=50

感覺自己網路流一竅不通

這題就是乙個裸的網路流啊。。。

但是我完全不會做

真的覺得網路流白學了。。。

很明顯,危橋只能走\(2\)次,那麼容量為\(2\)

普通的橋隨便走,容量為\(inf\)

直接把兩個點連起來就行了。。。

因為有兩個源點,兩個匯點

建立超級源、匯就行了。

值得注意的是

如果只跑\(a1,b1->a2,b2\)的網路流

會存在一些奇怪的情況,雖然是滿流

但是可能存在你\(a1->a2\)的流跑到了\(b2\)去了

因此,換一組源點(反正邊都是雙向的)

再跑一次,這樣就沒有問題了。。。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define rg register

#define max 55

#define inf 1000000000

inline int read()

struct linee[max*max*2];

int h[max],cnt=2;

inline void add(int u,int v,int w)

;h[u]=cnt++;

e[cnt]=(line);h[v]=cnt++;

}int level[max],s,t;

bool bfs()

} return level[t];

}int dfs(int u,int flow)

} if(!ret)level[u]=0;

return ret;

}int dinic()

void init()

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

char g[max][max];

int main()

init();

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

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

if(g[i][j]=='n')add(i,j,inf);

else if(g[i][j]=='o')add(i,j,2);

add(s,a1,an<<1);add(s,b2,bn<<1);

add(a2,t,an<<1);add(b1,t,bn<<1);

if(dinic()!=(an+bn)*2)fl=false;

puts(fl?"yes":"no");

} return 0;

}

BZOJ 3504 危橋(網路流)

題目大意 n n 50 座島,互相之間有或者沒有雙向邊相連,有的邊可以走兩次,有的可以走無限次,問是否可以從a1 a2往返an次 從b1 b2往返bn次。題解 最大流,建圖比較顯然,用流量限制邊走的次數。因為是雙向邊,往返就是走兩次。所以,s向a1 b1連邊,a2 b2向t連邊,邊權為2an 2bn...

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...