不难发现,一个点对其他点有影响,他必然是割点,然后就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;
}