[APIO2018]铁人两项——圆方树+树形DP
生活随笔
收集整理的這篇文章主要介紹了
[APIO2018]铁人两项——圆方树+树形DP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:
[APIO2018]鐵人兩項
對于點雙連通分量有一個性質:在同一個點雙里的三個點$a,b,c$,一定存在一條從$a$到$c$的路徑經過$b$且經過的點只被經過一次。
那么我們建出原圖的圓方樹,枚舉中間點$b$,一對合法的$a,c$需要使這兩個點位于與$b$直接相連的方點的不同子樹中。樹形$DP$,對圓點和方點分別統計答案即可。
#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int n,m; int x,y; vector<int>q[200010]; int head[100010]; int to[400010]; int next[400010]; int size[200010]; int low[100010]; int dfn[100010]; int tot; int cnt; int num; int st[100010]; int top; int vis[200010]; ll ans; int sum; void add(int x,int y) {tot++;next[tot]=head[x];head[x]=tot;to[tot]=y; } void insert(int x,int y) {q[x].push_back(y); } void tarjan(int x) {st[++top]=x;low[x]=dfn[x]=++num;for(int i=head[x];i;i=next[i]){if(!dfn[to[i]]){tarjan(to[i]);low[x]=min(low[x],low[to[i]]);if(low[to[i]]>=dfn[x]){insert(++cnt,x);insert(x,cnt);int now=0;do{now=st[top--];insert(cnt,now);insert(now,cnt);}while(now!=to[i]);}}else{low[x]=min(low[x],dfn[to[i]]);}} } void dfs(int x,int fa) {vis[x]=1;size[x]=(x<=n?1:0);int len=q[x].size();for(int i=0;i<len;i++){int to=q[x][i];if(to!=fa){dfs(to,x);size[x]+=size[to];}} } void tree_dp(int x,int fa) {int len=q[x].size();for(int i=0;i<len;i++){int to=q[x][i];if(to!=fa){tree_dp(to,x);}}if(x<=n){for(int i=0;i<len;i++){int to=q[x][i];if(to!=fa){ans+=1ll*size[to]*(sum-size[to]-1);}else{ans+=1ll*(sum-size[x])*(size[x]-1);}}}else if(len>=3){for(int i=0;i<len;i++){int to=q[x][i];if(to!=fa){ans+=1ll*size[to]*(sum-size[to])*(len-2);}else{ans+=1ll*(sum-size[x])*size[x]*(len-2);}}} } int main() {scanf("%d%d",&n,&m);cnt=n;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}for(int i=1;i<=n;i++){if(!dfn[i]){tarjan(i);}}for(int i=1;i<=cnt;i++){if(!vis[i]){dfs(i,0);sum=size[i];tree_dp(i,0);}}printf("%lld",ans); }轉載于:https://www.cnblogs.com/Khada-Jhin/p/10346332.html
總結
以上是生活随笔為你收集整理的[APIO2018]铁人两项——圆方树+树形DP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下二进制mysql的卸载以
- 下一篇: 修改IIS默认的30M