APIO2018 鐵人兩項

2022-04-30 19:27:10 字數 963 閱讀 2878

題意:在乙個無向圖裡面選三個點\(s\),\(c\),\(f\)

需要能夠從\(s\)出發,經過\(c\),到達\(f\)點,中間不能提前經過\(f\),且需要是乙個簡單路徑

solution:

簡單路徑當然就是園方樹了,想想怎麼統計答案

yy一下可以發現,有一條路徑\(s\),\(f\),中間能選的點就是路徑上的圓點和

因為在乙個點雙連通分量裡面,一定有乙個不重複的路徑到出點去。

想想怎麼賦權,方點賦連線的圓點個數,圓點為-1,最後一條路徑的權值和剛好就是去掉兩個頭的圓點個數,

然後就是個簡單的dp計數了

code:

#include#define ll long long

#define r register

#define pb push_back

templatevoid rea(t &x)

while(isdigit(ch))

x = f?-x:x;

}using namespace std;

const int n = 500005;

vectori[n], e[n<<1];

ll ans;

int n, m, node, num;

int dfn[n], low[n], dfc, sta[n], tp;

int val[n<<1], siz[n<<1];

bool vis[n<<1];

void tarjan(int x)

e[x].pb(node), e[node].pb(x);

}} else low[x] = min(low[x], dfn[i[x][i]]); }}

void cal(int x, int fa)

ans += 2ll * siz[x] * (num-siz[x]) * val[x];

}int main()

APIO2018 鐵人兩項 圓方樹

給定一張無向圖,詢問存在多少三元組 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 ...

APIO2018 鐵人兩項 圓方樹 樹形DP

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

APIO2018 Duathlon 鐵人兩項

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