COGS 345 共榮圈 426 血帆海盜

2022-08-15 21:00:19 字數 1920 閱讀 4333

題面

網路流+tarjan好題,但如果你真的的理解了網路流反向邊的作用,那這就是一道大水題……

題目要求出一定在最大流中的邊的數目,顯然先跑網路流(廢話),然後考慮到題目要求的是一定在最大流中的邊,換就話說,這條邊要不可替代,什麼邊不可替代呢——

割邊(大霧)

連線著兩個強連通分量的邊。

為什麼呢?

若一條邊在某個強連通分量中,則這條邊連線的兩個點x—>y

,一定存在一條路徑y—>x,且這條路徑上的邊全部都是反向邊,故原圖中必然存在一條路徑從x—>y,且路徑上的邊全部都是未匹配邊

,即這條邊不是不可替代的。

於是,我們就可以在滿流的邊上跑tarjan,然後列舉每一條滿流的判斷即可。

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include

8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14

#define rg register

15#define ll long long

16using

namespace

std;

1718 inline int

gi()

1924

if (b) return r; return -r;25}

2627

const

int inf = 240002357, n = 1e5+5, m = 6e5+5;28

intn,m,w,s,t,time,num,mac[n],pre[n],f[n];

29int

stc[n],scc[n],dep[n],dfn[n],low[n];

30 queue q;

31struct

edge

32eg[m];

3536 inline void add(int x,int y,int

z)37

; f[x]=num;39}

4041 inline int dfs(int o,int

flow)

4258

if (!fl)

59 dep[o]=0;60

return

fl;61}62

63 inline int

bfs()

6482

q.push(to);83}

84}85return

dep[t];86}

8788 inline int

dinic()

8996

97 inline void tarjan(int

o)98

112else

if (!scc[to])

113 low[o]=min(low[o],dfn[to]);

114}

115if (low[o] ==dfn[o])

116123

while (to !=o);

124}

125}

126127

intmain()

128139

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

140144 w=dinic();

145for (i=s; i<=t; ++i)

146if (!dfn[i])

147tarjan(i);

148 m<<=1, m++;

149for (i=2; i<=m; i+=2

)150

157 printf("

%d\n

",ans);

158return0;

159 }

COGS血帆海盜

對於已經增廣後的圖,會出現一些反向邊,首先跑一邊最大流,只有對於被增廣的路才有可能成為答案,考慮每一條被曾廣的路,如果他在殘留網路中兩個端點在同乙個強連通分量裡,必然有其他的路徑可以代替這條邊,比如圖中1 2 3 4 構成乙個環3 2 1 4 3,3 2可以替代原來的1 2,所以只有那些被增廣後,起...

COGS902 樂曲主題

這個題一開始想的是hash 列舉長度 sort尋重o n2lo g2n 50002 12 3 108,但是模乙個數就wa了,模兩個數就t了 卡得不行不行的。問題在於,實際上長度顯然是單調合法的 如果len行,則小於len一定行 所以我們可以變列舉為二分。巨集哥orz 這也正是我沒有想到的了,最近總是...

COGS 2259 異化多肽

qaq 很明顯我們是可以搞一下指數生成函式的 然而複雜度是o m n2 o m n2 無法優化 換個方式做生成函式 a x 表示 質量為 x 的 氨基酸有幾類 b x i 0 a x i b x i 0 a x i 顯然答案是b x 中的n次項係數 上面的式子即為乙個無限等比數列求和 度度的公式s ...