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;
}

  

转载于:https://www.cnblogs.com/something-for-nothing/p/9069511.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值