結果
| 問題 |
No.416 旅行会社
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-10-29 06:13:33 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 171 ms / 4,000 ms |
| コード長 | 1,447 bytes |
| コンパイル時間 | 1,400 ms |
| コンパイル使用メモリ | 161,900 KB |
| 実行使用メモリ | 11,008 KB |
| 最終ジャッジ日時 | 2024-12-14 20:20:12 |
| 合計ジャッジ時間 | 4,349 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
コンパイルメッセージ
main.cpp: In function ‘int in()’:
main.cpp:38:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
38 | scanf("%d", &t);
| ~~~~~^~~~~~~~~~
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct edge { int u, v; };
struct node { int val; node *next; };
const int N = 1e5;
const int M = 2e5;
int n, m, q, par[N], c[M], d[M], ans[M];
bool dead[M];
edge g[M];
node body[N], *head[N], *tail[N];
bool operator<(const edge &a, const edge &b) {
return a.u != b.u ? a.u < b.u : a.v < b.v;
}
int find(int x) {
return par[x] = (par[x] == x ? x : find(par[x]));
}
void unite(int x, int y, int t) {
x = find(x);
y = find(y);
if (x == y) return;
if (x > y) swap(x, y);
par[y] = x;
if (x == 0) {
for (node *it = head[y]; it; it = it->next) ans[it->val] = t;
} else {
tail[x]->next = head[y];
tail[x] = tail[y];
}
}
int in() {
int t;
scanf("%d", &t);
return t;
}
int main() {
cin >> n >> m >> q;
for (int i = 0; i < n; i++) {
par[i] = body[i].val = i;
head[i] = tail[i] = &body[i];
}
for (int i = 0; i < m; i++) g[i].u = in() - 1, g[i].v = in() - 1;
sort(g, g + m);
for (int i = 0; i < q; i++) {
c[i] = in() - 1;
d[i] = in() - 1;
int k = lower_bound(g, g + m, (edge){ c[i], d[i] }) - g;
if (k < m && g[k].u == c[i] && g[k].v == d[i]) dead[k] = true;
}
for (int i = 0; i < m; i++) if (!dead[i]) unite(g[i].u, g[i].v, -1);
for (int i = q - 1; i >= 0; i--) unite(c[i], d[i], i + 1);
for (int i = 1; i < n; i++) printf("%d\n", ans[i]);
}