結果
| 問題 |
No.1813 Magical Stones
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-01-14 23:16:05 |
| 言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 207 ms / 2,000 ms |
| コード長 | 1,907 bytes |
| コンパイル時間 | 5,344 ms |
| コンパイル使用メモリ | 165,632 KB |
| 実行使用メモリ | 20,104 KB |
| 最終ジャッジ日時 | 2024-11-20 14:13:19 |
| 合計ジャッジ時間 | 7,175 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
/*
* 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 << max(cnt_out, cnt_in) << "\n";
}
return 0;
}