【題目描述】html
kotori有一個目標,要旅遊遍全日本。node
惋惜日本太大了,她沒有足夠的經費。因而kotori計劃遊覽n個地區。她從音乃木阪學院出發,但願把每條線路都走一遍,最後回到音乃木阪學院。ios
她認爲走同一條路是愚蠢的,所以在規劃旅遊線路的時候不能在同一條路上經歷兩次。jsp
n個地區之間共有m條線路。kotori想知道她是否能找到一個完美的規劃方案?spa
(注:兩個地區之間不保證只有一條線路。一個地區能夠被遊覽屢次)code
【輸入】htm
第一行有兩個整數n,m,表明地區數和線路數(1≤m,n≤100)。blog
接下來的m行,每行有兩個正整數a和b,表示a地區和b地區有一條線路鏈接。(1≤a,b≤n)get
音乃木阪學院記爲1號地區。string
【輸出】
若最終能規劃處線路,則輸出"Yes"。不然輸出"No"。
【樣例輸入】
3 4
1 2
3 1
1 3
1 2
【樣例輸出】
Yes
【樣例描述】
可選用1→2→1→3→1這樣的線路,依次使用第一條、第四條、第二條、第三條線路。
PS:這個是須要校園網才能訪問的。http://acm.bistu.edu.cn/acm/submit.jsp?problemID=2922&pageNo=1&pages=0
和我以前作的題幾乎同樣。http://www.javashuo.com/article/p-xiswqilv-mm.html (一筆畫問題)
不過,和這個一筆畫問題不一樣的是,這個題是要回到出發點,emmm,要審題。因此,奇點的個數只能爲0。
C++代碼:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 110; int father[maxn]; int node[maxn]; int n,m; int Find(int x){ while(x != father[x]){ father[x] = father[father[x]]; x = father[x]; } return x; } void Union(int a,int b){ int ax = Find(a); int bx = Find(b); if(ax != bx){ father[ax] = bx; } } int main(){ scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++){ father[i] = i; } int a,b; for(int i = 0; i < m;i++){ scanf("%d%d",&a,&b); Union(a,b); node[a]++; node[b]++; } int cnt = 0,cnt1 = 0; bool flag1 = true,flag2 = true; for(int i = 1; i <= n; i++){ if(father[i] == i){ cnt++; if(cnt == 2) flag1 = false; } if(node[i] & 1) cnt1++; } if(cnt1 != 0) flag2 = false; if(flag1 && flag2) printf("Yes\n"); else printf("No\n"); return 0; }