結果
| 問題 |
No.1640 簡単な色塗り
|
| コンテスト | |
| ユーザー |
magsta
|
| 提出日時 | 2021-07-07 20:04:53 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 210 ms / 2,000 ms |
| コード長 | 2,181 bytes |
| コンパイル時間 | 1,922 ms |
| コンパイル使用メモリ | 182,924 KB |
| 実行使用メモリ | 21,248 KB |
| 最終ジャッジ日時 | 2024-06-29 14:47:21 |
| 合計ジャッジ時間 | 14,289 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 53 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct Edge {
int u;
int v;
int num;
Edge(int a, int b, int c) : u(a), v(b), num(c) {
}
};
using Graph = vector<vector<Edge>>;
vector<bool> seen;
void dfs(const Graph& G, int v) {
seen[v] = true;
for (auto next_v : G[v]) {
if (seen[next_v.v]) continue;
dfs(G, next_v.v);
}
}
vector<bool> seen2, finished;
vector<int> flag;
vector<int> a, b;
int pos = -1;
stack<int> hist;
int edg;
void dfs2(const Graph& G, int v, int i) {
seen2[v] = true;
hist.push(v);
for (auto nv : G[v]) {
if (nv.num == i) continue;
if (finished[nv.v]) continue;
if (seen2[nv.v] && !finished[nv.v]) {
pos = nv.v;
edg = nv.num;
return;
}
dfs2(G, nv.v, nv.num);
if (pos != -1) return;
}
hist.pop();
finished[v] = true;
}
vector<bool> seen3;
void dfs3(const Graph& G, int v) {
seen3[v] = true;
for (auto next_v : G[v]) {
if (seen3[next_v.v]) continue;
if (edg == next_v.num) continue;
if (next_v.v == a[next_v.num] - 1) flag[next_v.num] = 0;
else flag[next_v.num] = 1;
dfs3(G, next_v.v);
}
}
int main() {
int N; cin >> N;
Graph G(N);
a.assign(N, 0);
b.assign(N, 0);
for (int i = 0; i < N; i++) {
cin >> a[i] >> b[i];
G[a[i] - 1].emplace_back(a[i] - 1, b[i] - 1, i);
G[b[i] - 1].emplace_back(b[i] - 1, a[i] - 1, i);
}
seen.assign(N, false);
flag.assign(N, -1);
seen2.assign(N, false);
finished.assign(N, false);
seen3.assign(N, false);
for (int i = 0; i < N; i++) {
if (seen[i]) continue;
dfs(G, i);
pos = -1; edg = -1;
dfs2(G, i, -1);
if (pos == -1) {
cout << "No" << endl;
return 0;
}
if (a[edg] - 1 == pos) flag[edg] = 0;
else flag[edg] = 1;
dfs3(G, pos);
}
cout << "Yes" << endl;
for (int i = 0; i < N; i++) {
if (flag[i] == -1) cout << "Error" << endl;
if (flag[i] == 0) cout << a[i] << endl;
if (flag[i] == 1) cout << b[i] << endl;
}
}
magsta