哥尼斯堡是位於普累格河上的一座城市,它包含兩個島嶼及連接它們的七座橋,如下圖所示。
可否走過這樣的七座橋,而且每橋只走過一次?瑞士數學家歐拉(Leonhard Euler,1707—1783)最終解決了這個問題,並由此創立了拓撲學。
這個問題如今可以描述為判斷歐拉回路是否存在的問題。歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條回路。現給定一個無向圖,問是否存在歐拉回路?
輸入格式:
輸入第一行給出兩個正整數,分別是節點數N (1≤N≤1000)和邊數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"); }