(歐拉圖 並查集 圖論) 2922. kotori和旅遊

【題目描述】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;
}
相關文章
相關標籤/搜索