Submission #60021

#TimeUsernameProblemLanguageResultExecution timeMemory
60021dukati8철인 이종 경기 (APIO18_duathlon)C++14
5 / 100
238 ms11288 KiB
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a; i<int(b); i++)
#define all(x) x.begin(),x.end()
bool flags[100000];
bool visits[100000];
vector<pair<int,int> > roads;
vector< vector<int> > close;
long long tot=0;
long long dp1[100000];
long long dp2[100000];
long long numfixed[100000];
bool dfs(int curr, int goal) {
  if (curr==goal) {flags[curr]=true; return true;}
  visits[curr]=true;
  for (auto a:close[curr]) {
    if (!visits[a]) {
      if (dfs(a,goal)) {flags[curr]=true; return true;}
    }
  }
  return false;
}
bool bfs(int start, int goal) {
  queue<int> order;
  order.push(start);
  int from[60];
  while (!order.empty()) {
    int now = order.front();
    order.pop();
    if (now==goal) {
      flags[now]=true;
      while (now!=start){
        now=from[now];
        flags[now]=true;
      }
      return true;
    }
    for (auto a:close[now]) {
      if (!visits[a]) {
        from[a]=now;
        order.push(a);
        visits[a]=true;
      }
    }
  }
  return false;
}
void dpupdate(int curr) {
  if (!flags[curr] && (close[curr].size()-numfixed[curr]==1 || close[curr].size()-numfixed[curr]==0)) {
    flags[curr]=true;
    long long tempcount=0;
    for (auto o:close[curr]) {
      if (flags[o]) {
        tot+=dp2[o];
        tempcount+=dp1[o];
      }
    }
    for (auto o: close[curr]) {
      if (!flags[o]) {
        dp1[o]+=dp1[curr];
        dp2[o]+=dp1[curr]+dp2[curr];
        numfixed[o]++;
        dpupdate(o);
      }
      else {
        tot+=dp1[o]*(tempcount-dp1[o]);
      }
    }
  }
}
int main() {
  int n,m;
  cin >>n >>m;
  if (n<=10) {
    close.assign(n,vector<int>());
    rep(i,0,m) {
      int u,v;
      cin >> u >> v;
      u--;v--;
      roads.push_back(make_pair(u,v));
      close[u].push_back(v);
      close[v].push_back(u);
    }
    int counter=0;
    rep(i,0,n) {
      rep (j,0,n) {
        rep (k,0,n) {
          if (i!=j && j!=k && i!=k) {
            //search route i to j and j to k, and if not works try other way instead.
            rep (x,0,n) {visits[x]=false; flags[x]=false;}
            if (bfs(i,j)) {
              rep (x,0,n) visits[x]=flags[x];
              if (bfs(j,k)) {counter++;}
              else {
                rep (x,0,n) {visits[x]=false; flags[x]=false;}
                if (bfs(j,k)) {
                  rep (x,0,n) visits[x]=flags[x];
                  if (bfs(j,i)) {counter++;}
                }
              }
            }
          }
        }
      }
    }
    cout << counter << endl;
  }
  else {
    //antag inga cykler
    close.assign(n,vector<int>());
    rep(i,0,m) {
      int u,v;
      cin >> u >> v;
      u--;v--;
      roads.push_back(make_pair(u,v));
      close[u].push_back(v);
      close[v].push_back(u);
    }

    rep (i,0,n) {dp1[i]=1; dp2[i]=0; numfixed[i]=0;}
    rep (i,0,n) {
      dpupdate(i);
    }
    cout << 2*tot << 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...