一開始想了一發費用流做法然後直接出負環了
首先,比較顯然的思路就是對於原圖中沒有限制的邊,對應的流量就是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...