割点模板中不是还要判断u是否为根节点吗QAQ,为什么这里不用了?
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
const int N=1e6+100;
int n,m,ans[N];
int si[N],dfn[N],low[N],flag[N],cnt,ti;
int head[N],to[N],ne[N],tot;
void add(int x,int y){
ne[++tot]=head[x];
to[tot]=y;
head[x]=tot;
}
bool vis[N];
vector<int>g;
inline void tarjan(int u){
dfn[u]=low[u]=++ti;
si[u]=1,ans[u]=n-1;
int rest=n-1;
for(re int i=head[u];i;i=ne[i]){
int v=to[i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
si[u]+=si[v];
if(low[v]>=dfn[u]) ans[u]+=si[v]*(n-si[v]),rest-=si[v];
}
else low[u]=min(low[u],dfn[v]);
}
ans[u]+=rest*(n-rest);
}
signed main(){
cin>>n>>m;
for(re int i=1;i<=m;i++){
int x,y;
scanf("%lld%lld",&x,&y);
add(x,y),add(y,x);
}
tarjan(1);
for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
}