BZOJ 1123 POI2008 BLO

1123: [POI2008]BLO

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1561  Solved: 728
[Submit][Status][Discuss]

Description

Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通。

Input

输入n<=100000 m<=500000及m条边

Output

输出n个数,代表如果把第i个点去掉,将有多少对点不能互通。

Sample Input

5 5
1 2
2 3
1 3
3 4
4 5

Sample Output

8
8
16
14
8

HINT

 

Source

 

在tarjin求割点的同时,维护一下不联通的对数和,最后不要忘了,在点i删去后i和其他n-1个点也不连通

#include <bits/stdc++.h>
#define ll long long
#define inf 1e9+10
using namespace std;
inline int read(){
	int x=0;int f=1;char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
	return x*f;
} 
const int MAXN=1e6+10;
struct node{
	int y,next;
}e[MAXN];
int linkk[MAXN],dfn[MAXN],low[MAXN],dfs_clock,siz[MAXN],m,n,len;
ll ans[MAXN];
inline void insert(int x,int y){
	e[++len].y=y;e[len].next=linkk[x];linkk[x]=len;
	e[++len].y=x;e[len].next=linkk[y];linkk[y]=len;
}
inline void tarjin(int x){
	dfn[x]=low[x]=++dfs_clock;
	ll t=0;siz[x]=1;
	for(int i=linkk[x];i;i=e[i].next){
		if(dfn[e[i].y]) low[x]=min(low[x],dfn[e[i].y]);
		else{
			tarjin(e[i].y);
			low[x]=min(low[x],low[e[i].y]);
			siz[x]+=siz[e[i].y];
			if(dfn[x]<=low[e[i].y]){
				ans[x]+=1LL*t*siz[e[i].y];
				t+=siz[e[i].y];
			} 
		}
	}
	ans[x]+=1LL*t*(n-t-1);
}
int main(){
	n=read();m=read();
	for(int i=1;i<=m;i++){
		int x=read();int y=read();
		insert(x,y);
	}
	tarjin(1);
	for(int i=1;i<=n;i++){
		printf("%lld\n",(ans[i]+n-1)*2);
	}
	return 0;
}

  

posted @ 2018-05-21 21:44  zhangenming  阅读(165)  评论(0编辑  收藏  举报