第11个点TLE
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
struct EDGE{
int ne,to;
}e[1000006],ee[1000006];
int s[100005];
int si[100005];
int dfn[200005];
int low[200005];
int stc[200005];
int bel[100005];
int hea[200005];
int head[100005];
bool vis[100005];
bool cut[100005];
int n,m,a,b;
int sum=1,su=1,sumc=0,ti=0,top=0,r;
vector<int> p[100005];
void add(int x,int y)
{
sum++;
e[sum].to=y;
e[sum].ne=head[x];
head[x]=sum;
}
void ad(int x,int y)
{
su++;
ee[su].to=y;
ee[su].ne=hea[x];
hea[x]=su;
s[x]++;
}
void tarjan(int x)
{
++ti;
low[x]=dfn[x]=ti;
stc[++top]=x;
for(int i=head[x];i;i=e[i].ne)
{
if(!dfn[e[i].to])
{
tarjan(e[i].to);
low[x]=min(low[x],low[e[i].to]);
if(dfn[x]<=low[e[i].to])
{
sumc++;
while(stc[top+1]!=e[i].to)
{
p[stc[top--]].push_back(sumc);
si[sumc]++;
}
p[x].push_back(sumc);
si[sumc]++;
}
}
else
low[x]=min(low[x],dfn[e[i].to]);
}
}
int dfs(int x)
{
int tot=si[x]-s[x];
if(si[x]==1)
tot=1;
vis[x]=1;
for(int i=hea[x];i;i=ee[i].ne)
{
if(ee[i].to!=r&&vis[ee[i].to]==0)
tot+=dfs(ee[i].to);
}
return tot;
}
int main()
{
long long ans;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
if(a==b)
continue;
add(a,b);
add(b,a);
}
tarjan(1);
for(int i=1;i<=n;i++)
{
if(p[i].size()>1)
{
sumc++;
bel[i]=sumc;
si[sumc]=1;
for(int j=0;j<p[i].size();j++)
{
ad(sumc,p[i][j]);
ad(p[i][j],sumc);
}
}
}
for(int l=1;l<=n;l++)
{
ans=2*(n-1);
r=bel[l];
if(p[l].size()==1)
printf("%lld\n",ans);
else
{
for(int i=1;i<=n;i++)
vis[i]=0;
for(int i=0;i<p[l].size();i++)
{
int d=dfs(p[l][i]);
ans+=1ll*d*(n-d-1);
}
printf("%lld\n",ans);
}
}
}