(1)九度上的練習題 題目描述: 歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條回路。現給定一個圖,問是否存在歐拉回路? 輸入: 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。當N為0時輸入結束。 輸出: 每個測試用例的輸出占一行,若歐拉回路存在則輸出1,否則輸出0。 樣例輸入: 3 3 1 2 1 3 2 3 3 2 1 2 2 3 0 樣例輸出: 1 0 來源: (2)實現源碼 [cpp] #include <iostream> #include <string.h> #include <stdlib.h> using namespace std; #define LEN 1001 bool visited[LEN]; bool arc[LEN][LEN]; int degree[LEN]; void DFS(int v, int n) { visited[v] = true; for(int i = 1;i<=n;i++) { if(!visited[i]&&arc[v][i]) DFS(i, n); } } bool isConnected(int n) { for(int i=1;i<=n;i++) { if(!visited[i]){return false;} } return true; } bool isCircuit(int n) { for(int i=1;i<=n;i++) { if(degree[i]%2) return false; } return true; } int main() { int p,q, n,m; while(cin>>n) { if(n == 0) break; cin>>m; memset(visited,0,LEN); memset(arc,0,sizeof(bool)*LEN*LEN); memset(degree,0,sizeof(int)*LEN); for(int i=0;i<m;i++) { cin>>p>>q; degree[p]++; degree[q]++; arc[p][q]=arc[q][p]=true; } DFS(1,n); if(!isConnected(n)) cout<<0<<endl; else { if(isCircuit(n)) cout<<1<<endl; else cout<<0<<endl; } } return 0; }