BZOJ1123&&P3469 [POI2008]BLO-Blockade

不难发现,一个点对其他点有影响,他必然是割点,然后就Trajan+乘法原理就行了

代码

//By AcerMo
#include<cmath>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int 
using namespace std;
const int M=1005000;
lli ans[M];	
int n,m,ind;
int dfn[M],low[M],fa[M],siz[M];
int cnt,to[M],nxt[M],head[M];
inline int read()
{
    int x=0;char ch=getchar();
    while (ch>'9'||ch<'0') ch=getchar();
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x;   
}
inline void add(int x,int y)
{
	to[++cnt]=y;nxt[cnt]=head[x];head[x]=cnt;
	to[++cnt]=x;nxt[cnt]=head[y];head[y]=cnt;
}
inline void tarjan(int x)
{
	dfn[x]=low[x]=++ind;siz[x]=1;
	lli qlm=0;
	for (int i=head[x];i;i=nxt[i])
	{
		if (!dfn[to[i]])
		{
			tarjan(to[i]);
			siz[x]+=siz[to[i]];
			low[x]=min(low[x],low[to[i]]);
			if (dfn[x]<=low[to[i]])
			{
				ans[x]+=(lli)qlm*siz[to[i]];
				qlm+=siz[to[i]];
			}		
		}
		else  
			low[x]=min(low[x],dfn[to[i]]);	
	}
	ans[x]+=(lli)qlm*(n-qlm-1);
	return ;
}
signed main()
{
	n=read();m=read();int x,y;
	for (int i=1;i<=m;i++)
		x=read(),y=read(),add(x,y);
	tarjan(1);
	for (int i=1;i<=n;i++)
		printf("%lld\n",(ans[i]+n-1)*2);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/81747850