結果
| 問題 | 
                            No.1813 Magical Stones
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2022-01-14 23:13:50 | 
| 言語 | C++17(clang)  (17.0.6 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,907 bytes | 
| コンパイル時間 | 2,674 ms | 
| コンパイル使用メモリ | 167,808 KB | 
| 実行使用メモリ | 20,100 KB | 
| 最終ジャッジ日時 | 2024-11-20 14:08:50 | 
| 合計ジャッジ時間 | 6,811 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge3 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 9 WA * 31 | 
ソースコード
/*
 * Author: nskybytskyi
 * Time:   2022-01-13 15:08:45
 */
#include <bits/stdc++.h>
using namespace std;
//https://cp-algorithms.com/graph/strongly-connected-components.html
int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<vector<int>> adj(n), adj_rev(n);
  vector<bool> used;
  vector<int> order, component;
  while (m--) {
    int a, b;
    cin >> a >> b;
    --a, --b;
    adj[a].push_back(b);
    adj_rev[b].push_back(a);
  }
  function<void(int)> dfs1 = [&] (int v) -> void {
    used[v] = true;
    for (auto u: adj[v])
      if (!used[u])
        dfs1(u);
    order.push_back(v);
  };
  function<void(int)> dfs2 = [&] (int v) -> void {
    used[v] = true;
    component.push_back(v);
    for (auto u : adj_rev[v])
      if (!used[u])
        dfs2(u);
  };
  used.assign(n, false);
  for (int i = 0; i < n; ++i)
    if (!used[i])
      dfs1(i);
  used.assign(n, false);
  reverse(order.begin(), order.end());
  vector<int> roots(n, 0);
  vector<int> root_nodes;
  for (auto v: order)
    if (!used[v]) {
      dfs2(v);
      int root = component.front();
      for (auto u : component) roots[u] = root;
      root_nodes.push_back(root);
      component.clear();
    }
  map<int, int> scc_in, scc_out;
  for (int v = 0; v < n; ++v) {
    int root_v = roots[v];
    scc_in[root_v] = scc_out[root_v] = 0;
  }
  for (int v = 0; v < n; v++)
    for (auto u : adj[v]) {
      int root_v = roots[v],
        root_u = roots[u];
      if (root_u != root_v) {
        ++scc_out[root_v];
        ++scc_in[root_u];
      }
    }
  if (root_nodes.size() == 1) {
    cout << 0 << "\n";
  } else {
    int cnt_in = 0, cnt_out = 0;
    for (auto [k, v] : scc_in) {
      if (!v) {
        ++cnt_in;
      }
    }
    for (auto [k, v] : scc_out) {
      if (!v) {
        ++cnt_out;
      }
    }
    cout << min(cnt_out, cnt_in) << "\n";
  }
  return 0;
}