結果
問題 |
No.2780 The Bottle Imp
|
ユーザー |
|
提出日時 | 2024-06-16 22:35:27 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 108 ms / 2,000 ms |
コード長 | 1,250 bytes |
コンパイル時間 | 1,298 ms |
コンパイル使用メモリ | 97,388 KB |
最終ジャッジ日時 | 2025-02-21 23:03:58 |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 40 |
ソースコード
#include <iostream> #include <vector> #include <set> #include "atcoder/scc" #include "atcoder/internal_type_traits" using namespace std; using namespace atcoder; int main() { int n; cin >> n; vector<vector<int>> a(n); for (int i = 0; i < n; ++i) { int m; cin >> m; a[i].resize(m); for (int j = 0; j < m; ++j) { cin >> a[i][j]; a[i][j]--; // Usize1に相当する処理 } } scc_graph scc(n); for (int i = 0; i < n; ++i) { for (int j : a[i]) { scc.add_edge(i, j); } } auto groups = scc.scc(); vector<int> labels(n); for (int i = 0; i < groups.size(); ++i) { for (int v : groups[i]) { labels[v] = i; } } int m = groups.size(); vector<set<int>> g(m); for (int i = 0; i < n; ++i) { for (int j : a[i]) { if (labels[i] != labels[j]) { g[labels[i]].insert(labels[j]); } } } int crr = labels[0]; int cnt = 1; while (g[crr].find(crr + 1) != g[crr].end()) { crr = *g[crr].find(crr + 1); cnt++; } bool ans = (cnt == m); cout << (ans ? "Yes" : "No") << endl; return 0; }