제출 #372257

#제출 시각아이디문제언어결과실행 시간메모리
372257nandonathaniel철인 이종 경기 (APIO18_duathlon)C++14
100 / 100
154 ms28268 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int node,cntbcc,n,tmp,low[MAXN],disc[MAXN],subtree[2*MAXN];
long long ans;
stack<int> S;
vector<int> adj[MAXN];
vector<int> adjbct[2*MAXN];

void dfs(int now,int par){
	tmp++;
	disc[now]=low[now]=tmp;
	S.push(now);
	node++;
	for(auto nxt : adj[now]){
		if(nxt==par)continue;
		if(disc[nxt]!=0)low[now]=min(low[now],disc[nxt]);
		else{
			dfs(nxt,now);
			low[now]=min(low[now],low[nxt]);
			if(low[nxt]>=disc[now]){
				cntbcc++;
				adjbct[now].push_back(n+cntbcc);
				while(adjbct[n+cntbcc].empty() || adjbct[n+cntbcc].back()!=nxt){
					adjbct[n+cntbcc].push_back(S.top());
					S.pop();
				}
			}
		}
	}
}

void dfsAns(int now){
	if(now<=n)subtree[now]=1;
	else subtree[now]=0;
	for(auto nxt : adjbct[now]){
		dfsAns(nxt);
		subtree[now]+=subtree[nxt];
		if(now>n){
			ans-=1LL*adjbct[now].size()*subtree[nxt]*(subtree[nxt]-1);
		}
	}
	if(now>n){
		ans-=1LL*adjbct[now].size()*(node-subtree[now])*(node-subtree[now]-1);
	}
}

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int m,u,v;
	cin >> n >> m;
	for(int i=1;i<=m;i++){
		cin >> u >> v; 
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	for(int i=1;i<=n;i++){
		if(!disc[i]){
			node=0;
			dfs(i,0);
			ans+=1LL*node*(node-1)*(node-2);
			dfsAns(i);
		}
	}
	cout << ans << '\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...