Submission #734868

#TimeUsernameProblemLanguageResultExecution timeMemory
734868keisuke6Duathlon (APIO18_duathlon)C++14
23 / 100
157 ms14392 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct Unionfind{
  vector<int> par, siz;
  //初期化
  Unionfind(int n) : par(n,-1) , siz(n,1) {}
  int root(int x) {
    if(par[x] == -1) return x;
    else return par[x] = root(par[x]);
  }
  bool issame(int x,int y) {
    return root(x) == root(y);
  }
  bool unite(int x, int y){
    x = root(x); y = root(y);
    if(x ==  y) return false;
    if(siz[x] < siz[y]) swap(x,y);
    par[y] =  x;
    siz[x] += siz[y];
    return  true;
  }
  int size(int x) {
    return siz[root(x)];
  }
};
int N,M;
vector<vector<int>> G(100100);
vector<int> A(100100,0);
void f(int u, int p){
  if(A[u]) return;
  A[u] = 1;
  for(int x:G[u]){
    if(x == p) continue;
    f(x,u);
    A[u] += A[x];
  }
  return;
}
signed main(){
  cin>>N>>M;
  Unionfind uf(N);
  for(int i=0;i<M;i++){
    int a,b;
    cin>>a>>b;
    a--;
    b--;
    G[a].push_back(b);
    G[b].push_back(a);
    uf.unite(a,b);
  }
  for(int i=0;i<N;i++) f(i,-1);
  int ans = 0;
  for(int i=0;i<N;i++){
    int n = uf.size(i);
    vector<int> S = {n-A[i]};
    for(int x:G[i]){
      if(A[x] > A[i]) continue;
      S.push_back(A[x]);
    }
    int sum = 0;
    int dec = 0;
    for(int x:S){
      sum += x;
      dec += x*x;
    }
    ans += sum*sum-dec;
  }
  cout<<ans<<endl;
}
#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...