HDU NO.1878 歐拉回路(鄰接矩陣,判斷歐拉回路的條件)
阿新 • • 發佈:2019-01-29
題意:(中文略)
思路:
存在歐拉回路的條件:所有頂點的度為偶數,並且圖是聯通的(每個點都可以遍歷)
這一類問題利用鄰接矩陣比較方便。
原題描述:
Description
歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路?Input
測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。當N為0時輸入結束。
Output
每個測試用例的輸出佔一行,若歐拉回路存在則輸出1,否則輸出0。Sample Input
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; }