[BZOJ1123][POI2008]BLO(tarjan求点双+树形dp)
2017-04-06 15:40
393 查看
题目描述
传送门题目大意:给出一个n个点m条边的无向连通图,问去掉每一个点之后存在多少点对不连通。
题解
tarjan求点双联通分量,对于每一个点双建立一个虚拟的节点,然后将这个点双的所有节点都连接到这个节点上,这样就形成了一棵树的结构容易知道这道题求的应该是去掉每一个点之后形成的联通块的每一个大小,然后利用乘法原理计算一下,所以建出树了之后dp一下就行了
代码
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define LL long long #define N 1000005 int n,m,dfs_clock,top,dcc; int tot,point ,nxt ,v ; int dfn ,low ,stack ;bool vis ; LL ans ; struct data { int tot,point ,nxt ,v ; int size ; void add(int x,int y) { ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; } void treedp(int x,int fa) { if (x<=n) size[x]=1; for (int i=point[x];i;i=nxt[i]) if (v[i]!=fa) { treedp(v[i],x); ans[x]+=size[x]*size[v[i]]; size[x]+=size[v[i]]; } ans[x]+=(LL)size[x]*(n-size[x]); } }tr; void add(int x,int y) { ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; } void tarjan(int x) { dfn[x]=low[x]=++dfs_clock;vis[x]=1;stack[++top]=x; for (int i=point[x];i;i=nxt[i]) if (!dfn[v[i]]) { tarjan(v[i]); low[x]=min(low[x],low[v[i]]); if (dfn[x]<=low[v[i]]) { int now=0;++dcc; while (now!=v[i]) { now=stack[top--]; vis[now]=0; tr.add(dcc+n,now); } tr.add(dcc+n,x); } } else if (vis[v[i]]) low[x]=min(low[x],dfn[v[i]]); } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;++i) { int x,y;scanf("%d%d",&x,&y); add(x,y),add(y,x); } tarjan(1); tr.treedp(1,0); for (int i=1;i<=n;++i) printf("%lld\n",ans[i]*2); }
相关文章推荐
- BZOJ 1123 POI2008 BLO Tarjan+树形DP
- bzoj 1123: [POI2008]BLO (tarjan求点双+树形DP)
- 【bzoj1123】【[POI2008]BLO】tarjan判割点
- BZOJ 1123: [POI2008]BLO tarjan求割点
- 【tarjan】【bzoj 1123】: [POI2008]BLO
- BZOJ 1123: [POI2008]BLO 点双联通,Tarjan求割点
- 【bzoj1123】【[POI2008]BLO】tarjan判割点
- 【BZOJ1123】 [POI2008]BLO (tarjan)
- BZOJ 1123: [POI2008]BLO( tarjan )
- bzoj1123 [POI2008]BLO(tarjan求割点)
- [bzoj1131][POI2008]Sta_树形dp
- bzoj1131 [POI2008]Sta(树形dp)
- BZOJ1123: [POI2008]BLO
- BZOJ1123: [POI2008]BLO
- BZOJ1123 [POI2008]BLO
- bzoj1123 [POI2008]BLO
- BZOJ 1131 [POI2008]Sta 树形DP
- BZOJ 2427 软件安装 树形dp+tarjan
- luogu 3478 bzoj 1131 poi2008 sta 树形dp
- 【BZOJ-1123】BLO Tarjan 点双连通分量