7-23 哥尼斯堡的“七橋問題”(25 分)


哥尼斯堡是位於普累格河上的一座城市,它包含兩個島嶼及連接它們的七座橋,如下圖所示。

可否走過這樣的七座橋,而且每橋只走過一次?瑞士數學家歐拉(Leonhard Euler,1707—1783)最終解決了這個問題,並由此創立了拓撲學。

這個問題如今可以描述為判斷歐拉回路是否存在的問題。歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條回路。現給定一個無向圖,問是否存在歐拉回路?

輸入格式:

輸入第一行給出兩個正整數,分別是節點數N (1N1000)和邊數M;隨后的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。

輸出格式:

若歐拉回路存在則輸出1,否則輸出0。

輸入樣例1:

6 10
1 2
2 3
3 1
4 5
5 6
6 4
1 4
1 6
3 4
3 6

輸出樣例1:

1

輸入樣例2:

5 8
1 2
1 3
2 3
2 4
2 5
5 3
5 4
3 4

輸出樣例2:

0


判斷是不是歐拉回路,還記得什么是歐拉回路嗎,連通圖,不存在奇數頂點,要通過所有邊一次且僅僅一次行遍所有頂點才叫歐拉圖。學離散果然有用。

代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define inf 999999999
int n,m,flag = 0;
int e[1001][1001];
int vis[1001];
int degree[1001];
void dfs(int s,int c)
{
    if(flag)return;
    if(c == n)
    {
        flag = 1;
        return;
    }
    for(int i = 1;i <= n;i ++)
    {
        if(vis[i] || e[s][i] == 0)continue;
        vis[i] = 1;
        dfs(i,c + 1);
        vis[i] = 0;
    }
}
int check()
{
    for(int i = 1;i <= n;i ++)
        if(degree[i]%2)return 0;
    return 1;
}
int main()
{
    int a,b;
    scanf("%d%d",&n,&m);
    for(int i = 0;i < m;i ++)
    {
        scanf("%d%d",&a,&b);
        e[a][b] = e[b][a] = 1;
        degree[a] ++;
        degree[b] ++;
    }
    vis[1] = 1;
    dfs(1,1);
    if(flag&&check())printf("1");
    else printf("0");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM