Submission #10941

#TimeUsernameProblemLanguageResultExecution timeMemory
10941dohyun0324우호 조약 체결 (JOI14_friends)C++98
100 / 100
112 ms12444 KiB
#include<stdio.h> #include<vector> using namespace std; vector<int>con[200010]; int f,r,n,m,x[200010],y[200010],group[100010],ranking[100010],cnt[100010],arr[100010],w,ch[100010]; long long dap; int finding(int x) { if(x==group[x]) return x; return finding(group[x]); } void union_find(int x,int y) { int p,q; p=finding(x); q=finding(y); if(ranking[p]==ranking[q]){ group[q]=p; ranking[p]++; } else if(ranking[p]>ranking[q]) group[q]=p; else group[p]=q; } int main() { int i,j,k; scanf("%d %d",&n,&m); for(i=1;i<=n;i++) group[i]=i; for(i=1;i<=m;i++){ scanf("%d %d",&x[i],&y[i]); con[x[i]].push_back(y[i]); } for(i=1;i<=n;i++){ k=con[i].size(); for(j=0;j<k-1;j++){ union_find(con[i][j],con[i][j+1]); ch[con[i][j]]=1; } if(j>0) ch[con[i][j]]=1; } for(i=1;i<=n;i++){ if(ch[i]) arr[++r]=i; } while(f!=r){ f++; if(con[arr[f]].size()==0) continue; k=con[arr[f]][0]; union_find(arr[f],k); if(ch[k]==0) ch[k]=1, arr[++r]=k; } for(i=1;i<=n;i++){ group[i]=finding(i); cnt[group[i]]++; } for(i=1;i<=n;i++) dap+=(long long)cnt[i]*(long long)(cnt[i]-1); for(i=1;i<=m;i++){ if(group[x[i]]!=group[y[i]]) dap++; } printf("%lld",dap); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...