九度:題目1027:歐拉回路
阿新 • • 發佈:2019-02-12
- 題目描述:
- 歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路?
- 輸入:
- 測試輸入包含若干測試用例。每個測試用例的第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
一上來我直接用遞迴暴搜,結果超時:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 1005 int N,M; int a,b; int map[MAX][MAX]; bool vis[MAX]; bool dfs(int k,int n){ if(n==N){ if(map[k][a])return true; else return false; } for(int i=1;i<=N;i++){ if(map[k][i]&&!vis[i]){ vis[i]=true; if(dfs(i,n+1))return true; vis[i]=false; } } return false; } int main(){ //freopen("C:\\in.txt","r",stdin); while(~scanf("%d",&N)&&N){ scanf("%d",&M); memset(map,0,sizeof(map)); memset(vis,0,sizeof(vis)); for(int i=0;i<M;i++){ scanf("%d%d",&a,&b); map[a][b]=map[b][a]=1; } vis[a]=true; printf("%d\n",dfs(a,1)); } return 0; } /************************************************************** Problem: 1027 User: starcuan Language: C++ Result: Time Limit Exceed ****************************************************************/
所以,得從歐拉回路的性質出發,
1、歐拉回路必須能從1一直能連線到n的連通圖,所以用並查集的話,就只能有1個集合
2、歐拉回路:
有向圖:所有的頂點出度=入度。
無向圖:所有頂點都是偶數度。
滿足上面兩個條件的話就一定是歐拉回路
所以,利用並查集和節點度數的奇偶判斷就可知是否是歐拉回路
/* 題目1027:歐拉回路 */ #include <iostream> #include <string.h> using namespace std; #define MAX 1005 int N,M; int a,b; int field[MAX]; int degree[MAX]; int find(int x) { if(field[x]==0) return x; field[x] = find(field[x]); return field[x]; } void make(int x,int y)//將x與y合併 { int f1=find(x); int f2=find(y); if(f1!=f2) field[f2]=f1; } int main() { //freopen("C:\\in.txt","r",stdin); while(cin>>N&&N) { cin>>M; memset(field,0,sizeof(field)); memset(degree,0,sizeof(degree)); while(M--) { cin>>a>>b; ++degree[a]; //a的度(出度)++ ++degree[b]; //b的度(入度)++ make(a,b);//將a b合併 } int cnt = 0; //集合的個數,等於1才滿足歐拉回路 int flag = 1; for(int i=1;i<=N;++i) { if(field[i]==0) cnt++; if(degree[i]%2==1) flag=0; } if(cnt!=1) flag=0; cout<<flag<<endl; } return 0; } /************************************************************** Problem: 1027 User: starcuan Language: C++ Result: Accepted Time:130 ms Memory:1528 kb ****************************************************************/