題面
網路流+tarjan好題,但如果你真的的理解了網路流反向邊的作用,那這就是一道大水題……
題目要求出一定在最大流中的邊的數目,顯然先跑網路流(廢話),然後考慮到題目要求的是一定在最大流中的邊,換就話說,這條邊要不可替代,什麼邊不可替代呢——
割邊(大霧)
連線著兩個強連通分量的邊。
為什麼呢?
若一條邊在某個強連通分量中,則這條邊連線的兩個點x—>y
,一定存在一條路徑y—>x,且這條路徑上的邊全部都是反向邊,故原圖中必然存在一條路徑從x—>y,且路徑上的邊全部都是未匹配邊
,即這條邊不是不可替代的。
於是,我們就可以在滿流的邊上跑tarjan,然後列舉每一條滿流的判斷即可。
1 #include 2 #include3 #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 ...