點這裡看題目。
首先,我們很容易看出,在 \(s\) 和 \(f\) 確定時,\(c\) 的備選數量就等於\(s\)到\(f\)所有簡單路徑的並的大小減二(要把\(s\)和\(f\)去掉)。
隨手畫幾個圖就會發現, \(s\) 到 \(f\) 所有簡單路徑的並似乎也就是\(s\)到\(f\)經過的所有點雙的並。
考慮證明這個猜想。首先,由於點雙之間最多只有乙個公共點,所以每個點雙內,每條從 \(s\) 到 \(f\) 的簡單路徑,必然是從乙個固定點進入點雙,從另乙個固定點離開。
因而我們只需要再證明:在點雙內部,對於任意三點\(a, b, c\),必然存在簡單路徑滿足從\(a\)到\(c\)到\(b\)。
為了方便,以下用\(u\oversetv\)表示從\(u\)向\(v\)連一條容量為\(c\)的邊。
考慮構建乙個網路來證明,如下:
拆點。對於\(u\)拆成\(u\)和\(u'\),並且連線\(u\overset u'\),表示每個點只能經過一次。
拆邊。無向邊先要拆成有向邊。對於有向邊\((u,v)\),連線\(u'\overset v\),表示邊只能經過一次。
連線源匯。連線\(s\overset c, a'\overset t,b'\overset t\)。
這樣,如果原圖最大流為 \(2\) ,則存在需要的路徑。
也就是說,我們需要證明,原圖最大流,也即是最小割為 \(2\) 。
設最小割為\(c\)。顯然\(c\le 2\)。那麼我們需要證明\(c>1\),即不可以只刪除一條邊就使得\(s\)到\(t\)不連通。
分類討論:
如果刪除 \(u\overset u'\) 的邊,我們就相當於拆掉了乙個點。根據點雙的定義,不影響連通性。
如果刪除 \(u'\overset v\) 的邊,我們就相當於拆掉了一條邊。由於這個操作影響比拆點更小,因而也不影響連通性。
刪除\(a'\overset t\)或者是\(b'\overset t\)。顯然只刪除一邊而另一邊留存都不會影響連通性。
因而有\(c>1\),根據連邊特性我們知道就有\(c=2\),即命題成立。
這也就是說,我們的猜想也是成立的。
因而我們只需要統計任意兩點之間,經過的點雙的並的大小減二即可。
考慮建出圓方樹,這樣任意兩點之間經過的點雙就是路徑上的方點。
下面需要使用到乙個技巧:為圓方樹上的點賦合適的權。
這一題中,我們首先可以猜想給方點賦為點雙大小。由於兩個點雙之間最多只有乙個交點,因而我們可以直接給圓點賦為 \(-1\) 進行扣除多餘貢獻。同時,圓點賦 \(-1\) 也能順帶處理 " 並集大小減二 " 這個情況。
總結一下,我們給圓點賦 \(-1\) ,方點賦大小,然後統計任意兩個圓點之間路徑的權值和即可。建出圓方樹後一邊 dfs 計算答案即可。時間\(o(n)\)。
#include typedef long long ll;
const int maxn = 2e5 + 5, maxm = 2e6 + 5;
templatevoid read( _t &x )
while( s >= '0' && s <= '9' )
x *= f;
}templatevoid write( _t x )
if( 9 < x )
putchar( x % 10 + '0' );
}template_t min( const _t a, const _t b )
struct graph
graph[maxm << 1];
int head[maxn] = {}, cnt;
graph()
void addedge( const int from, const int to )
void adde( const int from, const int to )
void nxt( int &ptr ) const
edge& operator ( const int indx )
}g, t;
int stk[maxn];
int siz[maxn], w[maxn];
int dfn[maxn], low[maxn];
ll ans;
int n, m, cnt, id, top, tot, subn;
void tarjan( const int u, const int fa )
}else low[u] = min( low[u], dfn[v] );
}}void dfs( const int u, const int fa )
ans += 2ll * siz[u] * ( subn - siz[u] ) * w[u];
}int main()
write( ans ), putchar( '\n' );
return 0;
}
2018APIO 進京趕考
先見識了一下ctsc的操作。漲了見識。打鐵匠x1 見識了個全英文的ppt,各種講課其實真的講的很好,只是邏輯性太強反而讓完全不會的同學有些尷尬。linux真的令人窒息。guide用不起就算了,控制台除錯。報錯直接密密麻麻打5頁螢幕看都看不懂。編譯都編譯不起我還玩個啥?我就聽懂了凱老師的講課,彈幕令人...
遊記 APIO2018遊記
update 雞排真好吃,明年有機會再來北京van明天就要去北京浪了,於是在模擬apio2015前嘗試去做了hash,很愉快地wa了,就開始了模擬apio2015的比賽。a題亂搞,c題亂搞,b題結果暴力都沒寫出來。感覺這為後面暴力沒搞出來暴力打好了堅實的基礎 hdhd過金牌線。總體還是很愉快的,每個...
APIO2018 鐵人兩項
題意 在乙個無向圖裡面選三個點 s c f 需要能夠從 s 出發,經過 c 到達 f 點,中間不能提前經過 f 且需要是乙個簡單路徑 solution 簡單路徑當然就是園方樹了,想想怎麼統計答案 yy一下可以發現,有一條路徑 s f 中間能選的點就是路徑上的圓點和 因為在乙個點雙連通分量裡面,一定有...