bzoj1123 [POI2008]BLO(tarjan求割点)
2017-09-15 15:07
411 查看
把某个割点去掉以后,会出现几个连通块,它们之间不能互相到达
即会分成上面一棵树,下面若干子树
子树之间不互通,所有子树和上面那个树不互通,通过记录树的大小统计答案
另外删去的点和其它点不互通。来自hzwer的题解
即会分成上面一棵树,下面若干子树
子树之间不互通,所有子树和上面那个树不互通,通过记录树的大小统计答案
另外删去的点和其它点不互通。来自hzwer的题解
#include <bits/stdc++.h> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define M 500010 #define N 100010 inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&& 4000 amp;ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int n,m,h ,num=0,dfn ,low ,dfnum=0,fa ,sz ; ll ans ; struct edge{ int to,next; }data[M<<1]; inline void add(int x,int y){data[++num].to=x;data[num].next=h[y];h[y]=num;} void tarjan(int x){ dfn[x]=low[x]=++dfnum;sz[x]=1;int tmp=0; for(int i=h[x];i;i=data[i].next){ int y=data[i].to; if(fa[x]==y) continue; if(dfn[y]) low[x]=min(low[x],dfn[y]); else{ fa[y]=x;tarjan(y);low[x]=min(low[x],low[y]);sz[x]+=sz[y]; if(low[y]>=dfn[x]){ ans[x]+=(ll)tmp*sz[y];tmp+=sz[y]; } } } ans[x]+=(ll)tmp*(n-tmp-1); } int main(){ // freopen("a.in","r",stdin); n=read();m=read(); while(m--){int x=read(),y=read();add(x,y);add(y,x);} tarjan(1); for(int i=1;i<=n;++i) printf("%lld\n",(ans[i]+n-1)*2); return 0; }
相关文章推荐
- BZOJ 1123: [POI2008]BLO 点双联通,Tarjan求割点
- BZOJ 1123: [POI2008]BLO( tarjan )
- bzoj 1123: [POI2008]BLO (tarjan求点双+树形DP)
- BZOJ 1123 POI2008 BLO Tarjan+树形DP
- 【bzoj1123】【[POI2008]BLO】tarjan判割点
- 【tarjan】【bzoj 1123】: [POI2008]BLO
- 【BZOJ1123】 [POI2008]BLO (tarjan)
- 【bzoj1123】【[POI2008]BLO】tarjan判割点
- [BZOJ1123][POI2008]BLO(tarjan求点双+树形dp)
- BZOJ 1123: [POI2008]BLO tarjan求割点
- bzoj1123 [POI2008]BLO
- BZOJ 1123 [POI2008]BLO(Tarjan算法)
- 【bzoj1123】[POI2008]BLO DFS树
- 【dfs+连通分量】Bzoj1123 POI2008 BLO
- bzoj 1123 [POI2008]BLO
- [BZOJ]1123 [POI2008]BLO 割点
- BZOJ1123: [POI2008]BLO
- 【BZOJ-1123】BLO Tarjan 点双连通分量
- BZOJ 1123: [POI2008]BLO
- BZOJ 1123: [POI2008]BLO [割点][乘法原理]