제출 #103726

#제출 시각아이디문제언어결과실행 시간메모리
103726autumn_eel철인 이종 경기 (APIO18_duathlon)C++14
31 / 100
425 ms32400 KiB
#include <bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
using namespace std;
typedef long long ll;
typedef pair<int,int>P;

struct BCC{
	int n;
	vector<vector<int>>E;
	vector<bool>used;
	vector<int>dep,low,cmp,cnt;
	set<P>bridge;
	vector<P>es;

	void dfs(int v,int p,int d){
		used[v]=true;
		low[v]=dep[v]=d;
		for(int u:E[v]){
			if(u==p)continue;
			if(used[u]){
				low[v]=min(low[v],dep[u]);
				continue;
			}
			dfs(u,v,d+1);
			if(dep[v]<low[u]){
				bridge.insert(P(min(v,u),max(v,u)));
			}
			low[v]=min(low[v],low[u]);
		}
	}
	void dfs2(int v,int k){
		cmp[v]=k;
		cnt[k]++;
		for(int u:E[v]){
			if(bridge.count(P(min(u,v),max(u,v)))||cmp[u]!=-1)continue;
			dfs2(u,k);
		}
	}
	BCC(vector<vector<int>>E):E(E){
		n=E.size();
		used=vector<bool>(n);
		dep=low=vector<int>(n);
		cmp=vector<int>(n,-1);
		rep(i,n){
			if(!used[i])dfs(i,-1,0);
		}
		int c=0;
		rep(i,n){
			if(cmp[i]==-1){
				cnt.push_back(0);
				dfs2(i,c++);
			}
		}
		for(auto p:bridge){
			es.push_back(P(cmp[p.first],cmp[p.second]));
		}
	}
	vector<int>getvs(){
		return cnt;
	}
	vector<P>getes(){
		return es;
	}
};

int n,m;
vector<int>E[200000];
int sz[200000];
bool used1[200000],used2[200000];
vector<int>vs;

ll ans=0;
int cnt=0;

void dfs1(int v){
	cnt+=vs[v];
	used1[v]=true;
	for(int u:E[v]){
		if(used1[u])continue;
		dfs1(u);
	}
}
void dfs2(int v,int p){
	used2[v]=true;
	int s=cnt-vs[v];
	sz[v]=vs[v];
	for(int u:E[v]){
		if(used2[u])continue;
		dfs2(u,v);
		sz[v]+=sz[u];
		s-=sz[u];
		ans+=sz[u]*(ll)(cnt-sz[u]-vs[v]);
	}
	ans+=s*(ll)(cnt-s-vs[v]);
	if(vs[v]>1){
		ans+=(ll)(cnt-vs[v])*(vs[v]-1)*(vs[v]-1)*2;
	}
}
int main(){
	scanf("%d%d",&n,&m);
	vector<vector<int>>G(n);
	rep(i,m){
		int a,b;scanf("%d%d",&a,&b);a--;b--;
		G[a].push_back(b);
		G[b].push_back(a);
	}
	BCC bcc(G);
	vs=bcc.getvs();
	auto res=bcc.getes();
	for(auto p:res){
		E[p.first].push_back(p.second);
		E[p.second].push_back(p.first);
	}
	for(int i:vs){
		if(i>=3){
			ans+=i*(ll)(i-1)*(ll)(i-2);
		}
	}
	rep(i,n){
		if(!used1[i]){
			cnt=0;
			dfs1(i);
			dfs2(i,-1);
		}
	}
	cout<<ans<<endl;
}

컴파일 시 표준 에러 (stderr) 메시지

count_triplets.cpp: In function 'int main()':
count_triplets.cpp:100:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&n,&m);
  ~~~~~^~~~~~~~~~~~~~
count_triplets.cpp:103:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int a,b;scanf("%d%d",&a,&b);a--;b--;
           ~~~~~^~~~~~~~~~~~~~
#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...