Byteotia城市有n個 towns m條雙向roads. 每條 road 鏈接 兩個不一樣的 towns ,沒有重複的road. 全部towns連通。php
Byteotia城市有n個 towns m條雙向roads. 每條 road 鏈接 兩個不一樣的 towns ,沒有重複的road. 全部towns連通。php
輸入n<=100000 m<=500000及m條邊ios
輸出n個數,表明若是把第i個點去掉,將有多少對點不能互通。ide
統計答案 我和正常人不同系列2333spa
咱們考慮當全部點都聯通時的答案 設每一個聯通塊大小爲$v_i$ 那麼顯然答案是$(\sum_{v_i \in V}v_i)^{2}$ 我就不展開了 你們知道里面長啥樣就好debug
而後減去$\sum_{v_i \in V}v_i^{2}$ 再加上$2*(V-1)$ 就是每一個點的答案code
/*To The End Of The Galaxy*/ #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<iomanip> #include<bitset> #include<stack> #include<map> #include<set> #include<cmath> #include<complex> #define debug(x) cerr<<#x<<"="<<x<<endl #define INF 0x7f7f7f7f #define llINF 0x7fffffffffffll using namespace std; typedef pair<int,int> pii; typedef long long ll; inline int init() { int now=0,ju=1;char c;bool flag=false; while(1) { c=getchar(); if(c=='-')ju=-1; else if(c>='0'&&c<='9') { now=now*10+c-'0'; flag=true; } else if(flag)return now*ju; } } inline long long llinit() { long long now=0,ju=1;char c;bool flag=false; while(1) { c=getchar(); if(c=='-')ju=-1; else if(c>='0'&&c<='9') { now=now*10+c-'0'; flag=true; } else if(flag)return now*ju; } } struct edge { int from,to,val,pre; }Edge[1000005]; int head[100005],cnt,n,m,size[100005],dfs_time,dfn[100005],low[100005]; ll ans[100005]; inline void addedge(int from,int to,int val) { ++cnt; Edge[cnt]=((edge){from,to,val,head[from]}); head[from]=cnt; } inline void tarjan(int now,int fa) { dfn[now]=low[now]=++dfs_time; int t=0; size[now]++; ans[now]=((ll)(n-1)*(n-1)); ans[now]+=(ll)2*(n-1); for(int j=head[now];j;j=Edge[j].pre) { if(!dfn[Edge[j].to]) { tarjan(Edge[j].to,now); size[now]+=size[Edge[j].to]; low[now]=min(low[now],low[Edge[j].to]); if(low[Edge[j].to]>=dfn[now]) { t+=size[Edge[j].to]; ans[now]-=((ll)size[Edge[j].to]*size[Edge[j].to]); } } else if(dfn[Edge[j].to]<dfn[now]&&Edge[j].to!=fa) { low[now]=min(low[now],dfn[Edge[j].to]); } } ans[now]-=((ll)(n-t-1)*(n-t-1)); } int main() { int u,v; n=init();m=init(); for(int i=1;i<=m;i++) { u=init();v=init(); addedge(u,v,1); addedge(v,u,1); } for(int i=1;i<=n;i++) { if(!dfn[i]) { tarjan(i,0); } } for(int i=1;i<=n;i++) { printf("%lld\n",ans[i]); } return 0; }