結果
| 問題 |
No.583 鉄道同好会
|
| コンテスト | |
| ユーザー |
はむこ
|
| 提出日時 | 2017-04-24 17:43:59 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 69 ms / 2,000 ms |
| コード長 | 1,545 bytes |
| コンパイル時間 | 1,796 ms |
| コンパイル使用メモリ | 170,120 KB |
| 実行使用メモリ | 5,760 KB |
| 最終ジャッジ日時 | 2024-06-26 08:26:30 |
| 合計ジャッジ時間 | 2,502 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 16 |
ソースコード
#include <bits/stdc++.h>
#include <sys/time.h>
using namespace std;
#define rep(i,n) for(long long i = 0; i < (long long)(n); i++)
#define pb push_back
using ll = long long; using vll = vector<ll>; using vvll = vector<vll>;
struct UnionFind {
vector<int> data;
UnionFind(int size) : data(size, -1) { }
// x, yをマージ, O(A^-1)
bool unite(int x, int y) {
x = root(x); y = root(y);
if (x != y) {
if (data[y] < data[x]) swap(x, y);
data[x] += data[y]; data[y] = x;
}
return x != y;
}
// x, yが同じ集合なら1, O(A^-1)
bool find(int x, int y) {
return root(x) == root(y);
}
// xの根を探す。同じ集合なら同じ根が帰る, O(A^-1)
int root(int x) {
return data[x] < 0 ? x : data[x] = root(data[x]);
}
};
int main(void) {
ll n, m; cin >> n >> m;
assert(n >= 2);
assert(n <= 500);
assert(m >= 1);
assert(m <= n*(n-1)/2);
vvll g(n);
UnionFind uf(n);
set<ll> vs;
rep(i, m) {
ll u, v; cin >> u >> v;
assert(0 <= u && u <= n - 1);
assert(0 <= v && v <= n - 1);
g[u].pb(v);
g[v].pb(u);
vs.insert(u);
vs.insert(v);
uf.unite(u, v);
}
for (auto x : vs) {
if (!uf.find(*vs.begin(), x)) {
cout << "NO" << endl;
return 0;
}
}
ll ret = 0;
rep(i, n)
ret += g[i].size() & 1;
cout << (ret == 0 || ret == 2 ? "YES" : "NO") << endl;
return 0;
}
はむこ