結果
問題 | No.583 鉄道同好会 |
ユーザー | ahe100 |
提出日時 | 2018-06-29 17:13:39 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 52 ms / 2,000 ms |
コード長 | 1,580 bytes |
コンパイル時間 | 1,106 ms |
コンパイル使用メモリ | 86,280 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-06-30 23:50:18 |
合計ジャッジ時間 | 2,187 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 1 ms
6,940 KB |
testcase_05 | AC | 1 ms
6,944 KB |
testcase_06 | AC | 1 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,944 KB |
testcase_09 | AC | 1 ms
6,940 KB |
testcase_10 | AC | 1 ms
6,940 KB |
testcase_11 | AC | 13 ms
6,940 KB |
testcase_12 | AC | 19 ms
6,948 KB |
testcase_13 | AC | 19 ms
6,940 KB |
testcase_14 | AC | 19 ms
6,940 KB |
testcase_15 | AC | 24 ms
6,944 KB |
testcase_16 | AC | 43 ms
6,940 KB |
testcase_17 | AC | 51 ms
6,944 KB |
testcase_18 | AC | 52 ms
6,944 KB |
ソースコード
#include<cstdio> #include<cstring> #include<vector> #include<queue> #include<stack> #include<algorithm> #include<cmath> #include<climits> #include<string> #include<set> #include<unordered_set> #include<numeric> #include<map> #include<iostream> using namespace std; #define rep(i,n) for(int i = 0;i<((int)(n));i++) #define reg(i,a,b) for(int i = ((int)(a));i<=((int)(b));i++) #define irep(i,n) for(int i = ((int)(n)-1);i>=0;i--) #define ireg(i,a,b) for(int i = ((int)(b));i>=((int)(a));i--) typedef long long ll; typedef pair<ll, ll> mp; ll mod = 1e9+7; ll inf = 1e18; //AC //オイラー路 //グラフ問題にしては珍しく0-originであることに注意 //連結かどうかの判定も必須 struct UnionFind{ int n; vector<int> r,p; UnionFind(){} UnionFind(int sz):n(sz),r(sz,1),p(sz,0){iota(p.begin(),p.end(),0);} int find(int x){ return (x==p[x]?x:p[x]=find(p[x])); } bool same(int x,int y){ return find(x)==find(y); } void unite(int x,int y){ x=find(x);y=find(y); if(x==y) return; if(r[x]<r[y]) swap(x,y); r[x]+=r[y]; p[y]=x; } }; int main(void){ bool can=false,connect=true; ll n,m,a,b,deg[510]={},odd=0,present=-1; cin>>n>>m; UnionFind f(n); rep(i,m){ cin>>a>>b; deg[a]++; deg[b]++; f.unite(a,b); } rep(i,n){ // cout<<deg[i]<<endl; if(deg[i]>0){ if(present==-1){ present=i;//代表点 }else{ if(!f.same(present,i))connect=false; } } if(deg[i]%2==1)odd++; } if(odd==0 || odd==2)can=true; if(can && connect){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } return 0; }