結果
| 問題 |
No.583 鉄道同好会
|
| コンテスト | |
| ユーザー |
emthrm
|
| 提出日時 | 2021-09-23 01:24:41 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 132 ms / 2,000 ms |
| コード長 | 2,054 bytes |
| コンパイル時間 | 1,120 ms |
| コンパイル使用メモリ | 85,560 KB |
| 最終ジャッジ日時 | 2025-01-24 16:15:49 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 16 |
ソースコード
#include <algorithm>
#include <cassert>
#include <iostream>
#include <vector>
struct EulerianTrailInUndirectedGraph {
std::vector<int> trail;
EulerianTrailInUndirectedGraph(const int n) : n(n), graph(n), is_visited(n) {}
void add_edge(const int u, const int v) {
graph[u].emplace_back(v, graph[v].size());
graph[v].emplace_back(u, graph[u].size() - 1);
}
bool build(int s = -1) {
trail.clear();
int odd_deg = 0, edge_num = 0;
for (int i = 0; i < n; ++i) {
if (graph[i].size() & 1) {
++odd_deg;
if (s == -1) {
s = i;
}
}
edge_num += graph[i].size();
}
if (s == -1) {
for (int i = 0; i < n; ++i) {
if (!graph[i].empty()) {
s = i;
break;
}
}
if (s == -1) {
assert(edge_num == 0);
trail.emplace_back(0);
return true;
}
}
for (int i = 0; i < n; ++i) {
is_visited[i].assign(graph[i].size(), false);
}
if (odd_deg == 0 || (odd_deg == 2 && (graph[s].size() & 1))) {
dfs(s);
if (trail.size() == (edge_num >> 1) + 1) {
std::reverse(trail.begin(), trail.end());
return true;
}
trail.clear();
}
return false;
}
private:
struct Edge {
int dst, rev;
Edge(const int dst, const int rev) : dst(dst), rev(rev) {}
};
const int n;
std::vector<std::vector<Edge>> graph;
std::vector<std::vector<int>> is_visited;
void dfs(const int ver) {
const int deg = graph[ver].size();
for (int i = 0; i < deg; ++i) {
if (!is_visited[ver][i]) {
const int dst = graph[ver][i].dst;
is_visited[ver][i] = is_visited[dst][graph[ver][i].rev] = true;
dfs(dst);
}
}
trail.emplace_back(ver);
}
};
int main() {
int n, m;
std::cin >> n >> m;
EulerianTrailInUndirectedGraph eulerian_trail(n);
while (m--) {
int sa, sb;
std::cin >> sa >> sb;
eulerian_trail.add_edge(sa, sb);
}
std::cout << (eulerian_trail.build() ? "YES\n" : "NO\n");
return 0;
}
emthrm