Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits
Description
Input
Output
Sample Input
7 9 1 2 1 3 1 4 1 5 1 6 1 7 2 3 4 5 6 7
Sample Output
18 6 6 6 6 6 6
Data Constraint
Source / Author: 长乐一中 game
题解:
找割点
算答案。
#include<bits/stdc++.h>
#define N 50010
#define inf 2147483647
#define rint register ll
#define ll long long
#define point(a) multiset<a>::iterator
#define mod (ll)(500000)
#define mem(a,b) memset(a,b,sizeof (a))
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
struct edge
{ll v,fr;}e[N*4];
ll n,m,i,j,k,tot,cnt,chid,root;
ll tail[N],dfn[N],low[N],vis[N],size[N],suf[N],a[N],cut[N],ans[N],f[N];
void add(ll u,ll v)
{
e[++tot].v=v;
e[tot].fr=tail[u];
tail[u]=tot;
}
void tarjan(ll x,ll fr)
{
dfn[x] = low[x] = ++cnt;
vis[x]=1;
size[x]=1;
int can=0,cannot=0,sum=0;
for(ll p=tail[x];p;p=e[p].fr)
{
ll v=e[p].v;
if(!vis[v])
{
tarjan(v,fr);
size[x] = size[x] + size[v];
low[x] = min(low[x] , low[v]);
if(dfn[x] <= low[v] )
{
cut[x]=1;
sum +=size[v] * (n-1 - size[v]);
can+=size[v];
} else cannot+=size[v];
}
low[x] = min(low[x] , dfn[v]);
}
if(cut[x])sum+=can*(cannot+n-size[x]);
ans[x]+=sum/2;
}
// ll l ll ll l l
int main()
{
open("war");
scanf("%lld%lld",&n,&m);
for(i=1;i<=m;i++)
{
ll u,v;
scanf("%lld%lld",&u,&v);
add(u,v);add(v,u);
}
mem(vis,0); mem(cut,0);
mem(ans,0); mem(size,0);
for(i=1;i<=n;i++)ans[i]=n-1;
tarjan(1,1);
for(i=1;i<=n;i++)printf("%d\n",ans[i]);
return 0;
}