제출 #1228709

#제출 시각아이디문제언어결과실행 시간메모리
1228709kaiboyPipes (CEOI15_pipes)C++20
100 / 100
545 ms13996 KiB
// coached by rainboy #include <algorithm> #include <iostream> #include <vector> using namespace std; const int N = 100000; int ds0[N], ds1[N], ta[N], tb[N]; vector<int> ej[N]; int find(int *ds, int i) { return ds[i] < 0 ? i : (ds[i] = find(ds, ds[i])); } bool join(int *ds, int i, int j) { i = find(ds, i); j = find(ds, j); if (i == j) return false; if (ds[i] == ds[j]) ds[i]--; if (ds[i] < ds[j]) swap(i, j); ds[i] = j; return true; } void dfs(int p, int i) { static int t = 1; ta[i] = tb[i] = t++; int p_ = p; for (int j : ej[i]) if (j == p_) p_ = -1; else if (ta[j]) tb[i] = min(tb[i], ta[j]); else { dfs(i, j); tb[i] = min(tb[i], tb[j]); } if (p != -1 && ta[i] == tb[i]) cout << p + 1 << ' ' << i + 1 << '\n'; } int main() { ios_base::sync_with_stdio(false), cin.tie(NULL); int n, m; cin >> n >> m; for (int i = 0; i < n; i++) ds0[i] = ds1[i] = -1; while (m--) { int i, j; cin >> i >> j, i--, j--; if (join(ds0, i, j) || join(ds1, i, j)) { ej[i].push_back(j); ej[j].push_back(i); } } for (int i = 0; i < n; i++) if (!ta[i]) dfs(-1, i); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...