luogu3469 [POI2008]BLO-Blockade

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, m, uu, vv, hea[100005], cnt, siz[100005], dfn[100005], loo[100005], idx;
ll ans[100005];
bool ins[100005];
struct Edge{
	int too, nxt;
}edge[1000005];
void add_edge(int fro, int too){
	edge[++cnt].nxt = hea[fro];
	edge[cnt].too = too;
	hea[fro] = cnt;
}
void dfs(int x, int f){
	dfn[x] = loo[x] = ++idx;
	siz[x] = 1;
	ins[x] = true;
	int fla=0, sum=0;
	bool isc=false;
	for(int i=hea[x]; i; i=edge[i].nxt){
		int t=edge[i].too;
		if(!dfn[t]){
			dfs(t, x);
			siz[x] += siz[t];
			loo[x] = min(loo[x], loo[t]);
			if(loo[t]>=dfn[x]){
				fla++;
				sum += siz[t];
				ans[x] += (ll)siz[t] * (n - siz[t]);
				if(x!=1 || fla>1)	isc = true;
			}
		}
		else if(ins[t])	loo[x] = min(loo[x], dfn[t]);
	}	
	// if(x==1)	cout<<"1's isc: "<<isc<<endl;
	if(isc)	ans[x] += (ll)(n-sum-1)*(sum+1) + (n-1);
	else	ans[x] = 2 * (n - 1);
	ins[x] = false;
}
int main(){
	cin>>n>>m;
	for(int i=1; i<=m; i++){
		scanf("%d %d", &uu, &vv);
		add_edge(uu, vv);
		add_edge(vv, uu);
	}
	for(int i=1; i<=n; i++)
		if(!dfn[i])
			dfs(i, 0);
	for(int i=1; i<=n; i++)
		printf("%lld\n", ans[i]);
	return 0;
}
posted @ 2018-04-09 08:55  poorpool  阅读(116)  评论(0编辑  收藏  举报