hdu-1878(歐拉回路)

歐拉回路練習題,順便整理一下判斷歐拉回路(歐拉圖)和歐拉通路(半歐拉圖)的條件。

1. 歐拉回路(歐拉圖)

無向圖存在歐拉回路的充要條件:一個無向圖存在歐拉回路,當且僅當該圖所有頂點度數都爲偶數,且該圖是連通圖。

有向圖存在歐拉回路的充要條件:一個有向圖存在歐拉回路,所有頂點的入度等於出度且該圖是連通圖。

2. 歐拉通路(半歐拉圖):

無向圖存在歐拉通路的充要條件:一個無向圖存在歐拉通路,當且僅當只有兩個節點的度數爲奇數(即開始點和結束點)。

有向圖存在歐拉通路的充要條件:一個有向圖存在歐拉通路,除兩個節點(開始點和結束點)外,其它節點的入度等於出度,開始點的出度比入度大1,結束點的入度比出度大1。

回到這道題

題目大意:題目意思很明白,就不多說了。附鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1878

大體思路:創建一個記錄各個節點度數的數組 a[1005],用並查集判斷是否是連通圖。

以下是ac代碼:

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int a[1005];
int fa[1005];

int getfa(int x){
    if(fa[x]==x)
        return x;
    else
        return fa[x]=getfa(fa[x]);
}
int main(){
    int n,m;
    while(cin>>n){
        if(!n)
            break;
        cin>>m;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
            fa[i]=i;
        int x,y;
        for(int i=0;i<m;i++){
            cin>>x>>y;
            a[x]++;
            a[y]++;
            x=getfa(x);
            y=getfa(y);
            fa[x]=y;
        }
        int i;
        for(i=1;i<=n;i++)
            if(a[i]%2||getfa(i)!=fa[1])
                break;
        if(i<n)
            cout<<0<<endl;
        else
            cout<<1<<endl;
    }
    return 0;
}


發佈了39 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章