結果
| 問題 |
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;
}