結果
| 問題 |
No.583 鉄道同好会
|
| コンテスト | |
| ユーザー |
ldsyb
|
| 提出日時 | 2017-10-28 00:08:15 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,703 bytes |
| コンパイル時間 | 2,091 ms |
| コンパイル使用メモリ | 181,324 KB |
| 実行使用メモリ | 5,972 KB |
| 最終ジャッジ日時 | 2024-11-21 23:50:56 |
| 合計ジャッジ時間 | 3,198 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 13 WA * 3 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct graph {
struct edge {
int from, to;
T cost;
};
vector<edge> edges;
vector<vector<int>> g;
int n;
graph(int n) : n(n) {
g.resize(n);
}
virtual void add(int from, int to, T cost) = 0;
};
template <typename T>
struct undirected_graph : graph<T> {
using graph<T>::edges;
using graph<T>::g;
using graph<T>::n;
undirected_graph(int n) : graph<T>(n) {
}
void add(int from, int to, T cost = 1) {
assert(0 <= from && from < n && 0 <= to && to < n);
g[from].emplace_back(edges.size());
g[to].emplace_back(edges.size());
edges.push_back({from, to, cost});
}
};
template <typename T>
vector<T> dijkstra(const graph<T> &g, int start) {
assert(0 <= start && start < g.n);
vector<T> dist(g.n, numeric_limits<T>::max());
priority_queue<pair<T, int>, vector<pair<T, int>>, greater<pair<T, int>>> s;
dist[start] = 0;
s.emplace(dist[start], start);
while (!s.empty()) {
T expected = s.top().first;
int i = s.top().second;
s.pop();
if (expected != dist[i]) {
continue;
}
for (int id : g.g[i]) {
auto &e = g.edges[id];
if (dist[i] + e.cost < dist[e.to]) {
dist[e.to] = dist[i] + e.cost;
s.emplace(dist[e.to], e.to);
}
}
}
return dist;
}
int main() {
int n, m;
cin >> n >> m;
undirected_graph<int> g(n);
for (int i = 0; i < m; i++) {
int from, to;
cin >> from >> to;
g.add(from, to);
}
auto d = dijkstra(g, 0);
for (auto i : d) {
if (i == numeric_limits<int>::max()) {
cout << "NO" << endl;
return 0;
}
}
int puni = 0;
for (auto &v : g.g) {
if (v.size() & 1) {
puni++;
}
}
cout << (puni < 3 ? "YES" : "NO") << endl;
return 0;
}
ldsyb