給定一張無向圖,詢問存在多少三元組(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兩點在圓方樹上的...