結果
| 問題 |
No.416 旅行会社
|
| ユーザー |
mban
|
| 提出日時 | 2017-04-20 22:40:06 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 617 ms / 4,000 ms |
| コード長 | 1,547 bytes |
| コンパイル時間 | 958 ms |
| コンパイル使用メモリ | 83,964 KB |
| 実行使用メモリ | 26,704 KB |
| 最終ジャッジ日時 | 2024-12-14 20:23:49 |
| 合計ジャッジ時間 | 8,464 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
#include<iostream>
#include<map>
#include<vector>
using namespace std;
#define REP(i,n) for(int i=0;i<n;i++)
int n, m, q, zero = 0;
vector<int>v[100000];
pair<int,int> ab[200000], cd[200000];
map<pair<int,int>, bool>mp;
int par[100000], r[100000], ans[100000];
int root(int a) {
if (par[a] == a)return a;
else return root(par[a]);
}
void uni(int a, int b, int c) {
a = root(a);
b = root(b);
if (a != b) {
if (r[a] < r[b]) {
for (int i : v[a]) {
v[b].push_back(i);
if (zero == b) {
if(ans[i]==0)
ans[i] = c;
}
}
if (zero == a) {
for (int i : v[b]) {
if (ans[i] == 0)
ans[i] = c;
}
zero = b;
}
par[a] = b;
}
else {
for (int i : v[b]) {
v[a].push_back(i);
if (zero == a) {
if (ans[i] == 0)
ans[i] = c;
}
}
par[b] = a;
if (zero == b) {
for (int i : v[a]) {
if (ans[i] == 0)
ans[i] = c;
}
zero = a;
}
if (r[a] == r[b])r[a]++;
}
}
}
void uni(pair<int,int> b, int c) {
uni(b.first, b.second, c);
}
int main() {
cin >> n >> m >> q;
REP(i, m) {
int a, b;
cin >> a >> b;
ab[i].first = a - 1;
ab[i].second = b - 1;
}
REP(i, q) {
int a, b;
cin >> a >> b;
cd[i].first = a - 1;
cd[i].second = b - 1;
mp[cd[i]] = true;
}
REP(i, n) {
par[i] = i;
r[i] = 0;
v[i].push_back(i);
ans[i] = 0;
}
REP(i, m) {
if (!mp[ab[i]]) {
uni(ab[i], -1);
}
}
for (int i = q - 1; i >= 0; i--) {
uni(cd[i], i + 1);
}
for (int i = 1; i < n; i++) {
cout << ans[i] << endl;
}
return 0;
}
mban