APIO2018 鐵人兩項 圓方樹

2021-09-19 15:14:46 字數 1509 閱讀 5369

給定一張無向圖,詢問存在多少三元組(s,

c,f)

(s,c,f)

(s,c,f

)(s,c,

fs,c,f

s,c,

f各不相同)滿足存在一條從s

ss到c

cc,c

cc到f

ff的簡單路徑。

n ≤1

05,m

≤105

n \leq 10^5, m \leq 10^5

n≤105,

m≤10

5考慮建立圓方樹。

固定s ,f

s,fs,

f,滿足條件的c

cc一定存在s

ss到f

ff路徑上方點所代表的點雙上。

不妨設圓點權值為−1-1

−1,方點權值為其所代表的點雙的大小。那麼滿足條件的點c

cc數量為路徑上的權值(路徑上的圓點為割點,存在於多個點雙上,正好抵消)。

所以答案為經過某個點的路徑條數乘其權值的和。樹形dp即可。

#include

using

namespace std;

inline

intgi()

typedef

long

long ll;

const

int maxn =

100005

;int n, m;

struct edge

e[maxn *4]

;int h[maxn]

, tot;

inline

void

add(

int u,

int v)

; h[u]

= tot;

e[++tot]

=(edge)

; h[v]

= tot;

}int dfn[maxn]

, low[maxn]

, time, stk[maxn]

, top;

vector<

int> to[maxn <<1]

;int cnt, vis[maxn <<1]

, val[maxn <<1]

;ll up[maxn <<1]

, down[maxn <<1]

, ans;

void

tarjan

(int u,

int fa)

}else low[u]

=min

(low[u]

, dfn[v]);

}void

dfs1

(int u,

int fa)

}void

dfs2

(int u,

int fa)

//printf("%d %lld\n", u, ans);

}int

main()

APIO2018 鐵人兩項 圓方樹 樹形DP

apio2018 鐵人兩項 對於點雙連通分量有乙個性質 在同乙個點雙里的三個點 a,b,c 一定存在一條從 a 到 c 的路徑經過 b 且經過的點只被經過一次。那麼我們建出原圖的圓方樹,列舉中間點 b 一對合法的 a,c 需要使這兩個點位於與 b 直接相連的方點的不同子樹中。樹形 dp 對圓點和方點...

APIO2018 鐵人兩項

題意 在乙個無向圖裡面選三個點 s c f 需要能夠從 s 出發,經過 c 到達 f 點,中間不能提前經過 f 且需要是乙個簡單路徑 solution 簡單路徑當然就是園方樹了,想想怎麼統計答案 yy一下可以發現,有一條路徑 s f 中間能選的點就是路徑上的圓點和 因為在乙個點雙連通分量裡面,一定有...

APIO2018 Duathlon 鐵人兩項

給出一張無向圖,問有多少組點a,b,c滿足存在至少一條從a經過b到c的簡單路徑。首先考慮列舉點a,c,這樣每一組a,c對答案的貢獻就是可能在ac路徑之間出現的點的個數,然後我們可以對圖建圓方樹,使圓點的點權為 1 去重 方點的點權為點雙的大小,這樣ac路徑之間出現的點的個數就是a,c兩點在圓方樹上的...