結果
問題 | No.1813 Magical Stones |
ユーザー |
![]() |
提出日時 | 2022-01-15 00:12:41 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 298 ms / 2,000 ms |
コード長 | 2,502 bytes |
コンパイル時間 | 1,328 ms |
コンパイル使用メモリ | 94,408 KB |
実行使用メモリ | 21,212 KB |
最終ジャッジ日時 | 2024-11-20 16:23:44 |
合計ジャッジ時間 | 6,936 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 40 |
ソースコード
#include <iostream>#include <vector>#include <map>using namespace std;struct Graph{int n;std::vector<std::vector<int>> g;Graph(){}Graph(int n) : n(n){g.resize(n);}void add_edge(int from, int to){g[from].push_back(to);}};struct SCC //StronglyConnectedComponents{int n;int k;std::vector<std::vector<int>> g, rg;std::vector<bool> used;std::vector<int> cmp;std::vector<int> vs;SCC(){}SCC(int n) : n(n){g.resize(n);rg.resize(n);used.resize(n);cmp.resize(n);}void add_edge(int from, int to){g[from].push_back(to);rg[to].push_back(from);}void dfs(int u){used[u] = true;for(int v : g[u]){if(!used[v]) dfs(v);}vs.push_back(u);}void rdfs(int u, int k){used[u] = true;cmp[u] = k;for(int v : rg[u]){if(!used[v]) rdfs(v, k);}}int decomposition(){for(int i = 0; i < n; i++) used[i] = false;for(int i = 0; i < n; i++){if(!used[i]) dfs(i);}for(int i = 0; i < n; i++) used[i] = false;k = 0;for(int i = n - 1; i >= 0; i--){if(!used[vs[i]]){rdfs(vs[i], k);k++;}}return k;}int decomposition(Graph &dag){k = decomposition();dag.n = k;dag.g.resize(k);std::map<std::pair<int, int>, bool> mp;for(int u = 0; u < n; u++){for(int v : g[u]){if(!mp[std::pair<int, int> (cmp[u], cmp[v])] && cmp[u] != cmp[v]){mp[std::pair<int, int> (cmp[u], cmp[v])] = true;dag.add_edge(cmp[v], cmp[u]);}}}return k;}};int main(){int n, m;cin >> n >> m;SCC g(n);for(int i = 0; i < m; i++){int a, b;cin >> a >> b;a--; b--;g.add_edge(a, b);}Graph h;int k = g.decomposition(h);if(k == 1){cout << 0 << endl;return 0;}int d[100005]{0};for(int u = 0; u < k; u++){for(int v : h.g[u]) d[v]++;}int c0 = 0, c1 = 0;for(int u = 0; u < k; u++){if(h.g[u].size() == 0) c0++;if(d[u] == 0) c1++;}cout << max(c0, c1) << endl;}