显示代码纯文本
#include<iostream>
#include<cstdio>
#define next NEXT
using namespace std;
long long int dfn[100001];
long long int low[100001];
long long int ans[100001];
long long int head[100001];
long long int next[1000001];
long long int e[1000001];
long long int SIZE[100001];
bool gd[100001];
long long int n,m,cnt=0,a,b,num=0;
void ADD(int a,int b)
{
e[++cnt]=b;
next[cnt]=head[a];
head[a]=cnt;
}
void TARJAN(int x)
{
dfn[x]=++num;
low[x]=dfn[x];
SIZE[x]=1;
long long int sum=0,flag=0;
for(int i=head[x];i;i=next[i])
{
int y=e[i];
if(!dfn[y])
{
TARJAN(y);
SIZE[x]+=SIZE[y];
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x])
{
sum+=SIZE[y];
flag++;
ans[x]+=SIZE[y]*(n-SIZE[y]);
if(x!=1||flag>1)
{
gd[x]=true;
}
}
}
else
{
low[x]=min(low[x],dfn[y]);
}
}
if(gd[x]==1)
{
ans[x]+=n-1;
ans[x]+=(sum+1)*(n-sum-1);
}
else
ans[x]=2*(n-1);
}
int LINYIN()
{
freopen("BLO.in","r",stdin);
freopen("BLO.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
ADD(a,b);
ADD(b,a);
}
TARJAN(1);
for(int i=1;i<=n;i++)
{
printf("%lld\n",ans[i]);
}
return 0;
}
int sed=LINYIN();
int main()
{
;
}