洛谷3163 CQOI2014危橋 (最大流)

2021-09-05 01:17:50 字數 2961 閱讀 1109

一開始想了一發費用流做法然後直接出負環了

首先,比較顯然的思路就是對於原圖中沒有限制的邊,對應的流量就是inf

infin

f,如果是危橋,那麼流量就應該是222。

由於存在兩個起始點,我們考慮直接s

−>a1

,s

−>b1

s->a_1,s->b_1

s−>a1

​,s−

>b1

​然後對於終點,a2−

>t,

b2

−>

ta_2->t,b_2->t

a2​−

>t,

b2​−

>t

流量分別是次數的兩倍!

(因為往返相當於跑雙倍的單程)

然後跑最大流,看一下流量是不是(2×

(an+

bn))

(2\times (a_n+b_n))

(2×(an

​+bn

​))

但是這樣會存在乙個瑕疵。就是跑出來的路徑是a1−

>b2

a_1->b_2

a1​−

>b2

​那麼這時候,我們選擇交換b1和

b2

b_1和b_2

b1​和b2

​的位置,然後重新建圖跑最大流。

如果流量還是那個值,那就是yes

yesye

s。這是為什麼呢?如果兩次都是等於2×(

an+b

n)

2\times (a_n+b_n)

2×(an​

+bn​

),那麼只存在兩種情況,要麼是a1−

>a2

a_1->a_2

a1​−

>a2

​是可行的,要麼就是存在b1−

>a1

−>b2

b1->a1->b2

b1−>a1

−>b2

這樣一條路徑且路徑的流量是2∗b

n2*b_n

2∗bn

​,另一邊同理。

所以當兩次的流量都是合法的時候,那麼一定就是yes

yesye

s,否則就是nono

no

#include

#include

#include

#include

#include

#include

#include

#include

#define mk make_pair

#define ll long long

using namespace std;

inline

intread()

while

(isdigit

(ch)

)return x*f;

}const

int maxn =

3010

;const

int maxm =

2e6+

1e2;

const

int inf =

1e9;

int point[maxn]

,nxt[maxm]

,to[maxm]

;int flow[maxm]

,val[maxm]

;int cnt=

1,n,m;

int pre[maxm]

,from[maxn]

;int dis[maxn]

,vis[maxn]

;int num;

int s,t;

void

addedge

(int x,

int y,

int w)

void

insert

(int x,

int y,

int w)

int h[maxn]

;queue<

int> q;

bool bfs

(int s)}}

if(h[t]==-

1)return false;

return true;

}int

dfs(

int x,

int low)}if

(low>

0) h[x]=-

1;return totflow;

}int

dinic()

return ans;

}int a,b,c,d,e,f;

char ss[

1010][

1010];

void

init()

intmain()

}int tag=0;

s=maxn-10;

t=s+1;

insert

(s,a,

2*c)

;insert

(b,t,

2*c)

;insert

(s,d,

2*f)

;insert

(e,t,

2*f);if

(dinic()

==2*(c+f)

) tag++

;init()

;for

(int i=

1;i<=n;i++)}

insert

(s,a,

2*c)

;insert

(b,t,

2*c)

;insert

(s,e,

2*f)

;insert

(d,t,

2*f);if

(dinic()

==2*(c+f)

) tag++;if

(tag==2)

else

}return0;

}

BZOJ3504 CQOI2014危橋 最大流

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

3504 Cqoi2014 危橋 最大流

讀完題的感覺就是網路流啦。s連向倆起點,倆終點連向t。然而會有乙個bug。比如a1有x流到了b2,而b1有x流到了a2。這樣最後也是滿流,但其實是不合乎條件的。我們可以把b1,b2調換一下位置再跑一遍,如果還是滿流那麼就合乎題意啦。include include include define inf...

BZOJ3504 CQOI2014危橋(最大流)

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