BOJ 15752 - Hoofball

image.png

항상 outdegree=1 인 모든 정점들의 그래프이다.

in degree=0인 곳을 모두 탐색해준뒤, 이만큼 정답에 더해준다.

그리고 아직 방문되지 않은 곳들은 튀어나와있는 정점 없는 완벽히 싸이클을 이루는 곳이므로 그것들의 개수도 정답에 더해준다.

void solve() {  
   int n;  
   cin >> n;  
   vi a(n + 1, -1);  
   fv1(a);  
   sort(all(a));  
   debug(a);  
   int ans = 0;  
   auto to_right = [&](int i) {  
      if (i == 1) return true;  
      return i != n && a[i + 1] - a[i] < a[i] - a[i - 1];  
   };  
   vi in(n + 2);  
   for (int i = 1; i <= n; i++) {  
      if (to_right(i)) in[i + 1]++;  
      else in[i - 1]++;  
   }  
   debug(in);  
   vi vis(n + 1);  
   for (int i = 1; i <= n; i++) debug(i, to_right(i));  
   for (int i = 1; i <= n; i++) {  
      if (in[i] == 0) {  
         assert(vis[i] == 0);  
         vis[i] = 1;  
         ans++;  
         queue<int> q;  
         q.push(i);  
         while (sz(q)) {  
            int cur = q.front();  
            q.pop();  
            int nxt;  
            if (to_right(cur)) nxt = cur + 1;  
            else nxt = cur - 1;  
            if (!vis[nxt]) {  
               vis[nxt] = 1;  
               q.push(nxt);  
            }  
         }  
      }  
   }  
   for (int i = 1; i <= n; i++) {  
      if (!vis[i]) {  
         ans++;  
         vis[i] = 1;  
         queue<int> q;  
         q.push(i);  
         while (sz(q)) {  
            int cur = q.front();  
            q.pop();  
            int nxt;  
            if (to_right(cur)) nxt = cur + 1;  
            else nxt = cur - 1;  
            if (!vis[nxt]) {  
               vis[nxt] = 1;  
               q.push(nxt);  
            }  
         }  
      }  
   }  
   cout << ans;  
}

Tags:

Categories:

Updated:

Comments