1. 程式人生 > >資料結構實驗之圖論八:歐拉回路__DFS

資料結構實驗之圖論八:歐拉回路__DFS

Problem Description
在哥尼斯堡的一個公園裡,有七座橋將普雷格爾河中兩個島及島與河岸連線起來。
在這裡插入圖片描述
能否走過這樣的七座橋,並且每橋只走一次?瑞士數學家尤拉最終解決了這個問題並由此創立了拓撲學。尤拉通過對七橋問題的研究,不僅圓滿地回答了哥尼斯堡七橋問題,並證明了更為廣泛的有關一筆畫的三條結論,人們通常稱之為尤拉定理。對於一個連通圖,通常把從某結點出發一筆畫成所經過的路線叫做尤拉路。人們又通常把一筆畫成回到出發點的尤拉路叫做歐拉回路。具有歐拉回路的圖叫做尤拉圖。
你的任務是:對於給定的一組無向圖資料,判斷其是否成其為尤拉圖?

Input
連續T組資料輸入,每組資料第一行給出兩個正整數,分別表示結點數目N(1 < N <= 1000)和邊數M;隨後M行對應M條邊,每行給出兩個正整數,分別表示該邊連通的兩個結點的編號,結點從1~N編號。

Output
若為尤拉圖輸出1,否則輸出0。

Sample Input
1
6 10
1 2
2 3
3 1
4 5
5 6
6 4
1 4
1 6
3 4
3 6

Sample Output
1

Hint
如果無向圖連通並且所有結點的度都是偶數,則存在歐拉回路,否則不存在。

AC程式碼:

#include<bits/stdc++.h>
using namespace std;
int mp[1001][1001],vis[1001],dis[1001];
int n,m,sum;
void DFS(int x)
{
    vis[x]=1;
    sum++;
    for(int i=1; i<=n; i++)
    {
        if(mp[x][i]==1&&vis[i]==0)
            DFS(i);
    }
}
int main()
{
    int T,u,v;
    cin>>T;
    while(T--)
    {
        sum=0;
        memset(mp,0,sizeof(mp));
        memset(vis,0,sizeof(vis));
        memset(dis,0,sizeof(dis));
        cin>>n>>m;
        while(m--)
        {
            cin>>u>>v;
            mp[u][v]=mp[v][u]=1;
            dis[u]++,dis[v]++;
        }
        DFS(u);
        int i;
        for(i=1; i<=n; i++)
        {
            if(dis[i]%2==1) break;
        }
        if(i==n+1&&sum==n) cout<<"1\n";
        else cout<<"0\n";
    }
    return 0;
}

————
餘生還請多多指教!