[POI2008] BLO-Blockade - 洛谷
核心思路
size[u]子树大小
若u为割点,则判定点v构成的子树与u不连通。
sum表示当前u删去后新增的连通块大小(实时更新)
则ans[u] += (sum*size[v])
尾处理
ans[u]+=(n-sum-1)*sum;//向上处理 ,判断删去之后上方节点的大小
ans[u]+=(n-1);//单纯自己与别人匹配
AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5+10;
vector<int> g[N];
int size[N];
int dfn[N],low[N];
int cnt,n,m;
int ans[N];
void lht(int u){
++cnt;
dfn[u] = low[u] = cnt;
size[u] = 1;
int sum = 0;
for(int v:g[u]){
if(!dfn[v]){
lht(v);
low[u] = min(low[u],low[v]);
size[u]+=size[v];
if(dfn[u] <= low[v]){
ans[u]+=(sum*size[v]);
sum+=size[v];
}
}
else {
low[u] = min(low[u],dfn[v]);
}
}
ans[u]+=(n-sum-1)*sum;//向上处理
ans[u]+=(n-1);
}
signed main(){
cin>>n>>m;
for(int i = 1;i <= m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
lht(1);
for(int i =1 ;i <= n;i++){
cout<<ans[i]*2<<endl;
}
}