1. 程式人生 > >HDU NO.1878 歐拉回路(鄰接矩陣,判斷歐拉回路的條件)

HDU NO.1878 歐拉回路(鄰接矩陣,判斷歐拉回路的條件)

題意:(中文略)

思路:

存在歐拉回路的條件:所有頂點的度為偶數,並且圖是聯通的(每個點都可以遍歷)

這一類問題利用鄰接矩陣比較方便。

原題描述:

Description

歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路?

Input

測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。當N為0時輸入結 
束。

Output

每個測試用例的輸出佔一行,若歐拉回路存在則輸出1,否則輸出0。 

Sample Input

3 3 1 2 1 3 2 3 3 2 1 2 2 3 0

Sample Output

1 0

程式碼:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
#include<vector>
#include<set>

using namespace std;

#define X first
#define Y second

const int INF = 0x3f3f3f3f;
const int MAX = 1010;
int head[MAX];
int m, n;
int degree[MAX], Map[MAX][MAX];
bool vis[MAX];

void init(){
    memset(vis, 0, sizeof(vis));
    memset(Map, 0, sizeof(Map));
    memset(degree, 0, sizeof(degree));
}

void dfs(int now){
    vis[now] = 1;
    for(int i = 1; i <= m; i++){
        if(!vis[i] && Map[now][i])
            dfs(i);
    }
}
bool check(){
    bool flag = true;
    for(int i = 1; i <= m; i++)
        if(indegree[i] % 2)
            flag = false;
    return flag;
}

int main(){
    while(scanf("%d", &m) && m){
        scanf("%d", &n);
        init();
        int a, b;
        for(int i = 0; i < n; i++){
            scanf("%d%d", &a, &b);
            Map[a][b] = Map[b][a] = 1;
            degree[a]++;
            degree[b]++;
        }
        dfs(1);
        int k;
        for(k = 1; k <= m; k++){
            if(!vis[k])
                break;
        }
        if(check() && k > m)
            printf("1\n");
        else
            printf("0\n");
    }
    return 0;
}