結果
問題 |
No.416 旅行会社
|
ユーザー |
|
提出日時 | 2025-07-08 01:05:10 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 403 ms / 4,000 ms |
コード長 | 2,309 bytes |
コンパイル時間 | 2,133 ms |
コンパイル使用メモリ | 209,108 KB |
実行使用メモリ | 26,372 KB |
最終ジャッジ日時 | 2025-07-08 01:05:18 |
合計ジャッジ時間 | 7,751 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; vector<pair<int, int>> edges; vector<pair<int, int>> events; vector<int> lost_power; vector<int> parent, size_set; int find(int u) { return (parent[u] == u) ? u : find(parent[u]); } int findLevel(int u) { if(lost_power[u]!=0) return lost_power[u]; else{ if(parent[u] == u) return lost_power[u]; else return findLevel(parent[u]); } } void union_sets(int u, int v) { int rootU = find(u); int rootV = find(v); if (rootU != rootV) { if (size_set[rootU] < size_set[rootV]) swap(rootU, rootV); parent[rootV] = rootU; size_set[rootU] += size_set[rootV]; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int N, M, Q; cin >> N >> M >> Q; parent.resize(N + 1); size_set.assign(N + 1, 1); lost_power.assign(N + 1, 0); for (int i = 1; i <= N; i++) parent[i] = i; set<pair<int, int>> removed_edges; for (int i = 0; i < M; i++) { int A, B; cin >> A >> B; edges.push_back({A, B}); } for (int i = 0; i < Q; i++) { int C, D; cin >> C >> D; events.push_back({C, D}); removed_edges.insert({C, D}); removed_edges.insert({D, C}); } for (auto [A, B] : edges) { if (!removed_edges.count({A, B})) { union_sets(A, B); } } vector<bool> has_power(N + 1, false); for (int i = 1; i <= N; i++) { if (find(i) == find(1)) { has_power[i] = true; lost_power[i]=-1; } } for (int event_id = Q; event_id >= 1; event_id--) { int C = events[event_id - 1].first; int D = events[event_id - 1].second; int x = find(C); int y = find(D); if (has_power[x] && has_power[y]) { union_sets(x, y); continue; } union_sets(x, y); if (find(x) == find(1) || find(y) == find(1)) { has_power[x] = has_power[y] = true; if (lost_power[x] == 0) lost_power[x] = event_id; if (lost_power[y] == 0) lost_power[y] = event_id; } } for (int i = 2; i <= N; i++) { cout << findLevel(i) << "\n"; } return 0; }