1. 程式人生 > >【杭電1878】歐拉回路

【杭電1878】歐拉回路

歐拉回路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路?

Input

測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。當N為0時輸入結 
束。

Output

每個測試用例的輸出佔一行,若歐拉回路存在則輸出1,否則輸出0。 

Sample Input

3 3
1 2
1 3
2 3
3 2
1 2
2 3
0

Sample Output

1
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<stdio.h>
#include<string.h> #include<algorithm> using namespace std; int f[1100],d[1100]; int find(int x)//尋根 { if(x==f[x]) return x; else { f[x]=find(f[x]); return f[x]; } } void unio(int a,int b)//合併 { int nx=find(a); int ny=find(b); if(nx!=ny) f[ny]=nx; } int main() { int n,m,a,b; while
(~scanf("%d",&n),n) { scanf("%d",&m); memset(d,0,sizeof(d));//陣列清零 for(int i=1;i<=n;i++) f[i]=i;//節點初始化,開始自己是自己的跟 for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); d[a]++;//記錄每個點度數 d[b]++; unio(a,b); } int root=0; for(int i=1;i<=n;i++) { if(f[i]==i) root++; } if(root!=1)//最後只有一個根節點 { printf("0\n"); continue;//進入下一組資料 } int faut=1; for(int i=1;i<=n;i++) { if(d[i]%2!=0)//歐拉回路每個點的度數都是偶數 {faut=0; break; } } if(faut==1) printf("1\n"); else printf("0\n"); } return 0; }
下面是稍作修改的
#include<stdio.h>
#include<string.h>
//#include<algorithm>
//using namespace std;有這兩行也報錯,哎╮(╯▽╰)╭
int f[1100];
int d[1100];
int rand[1100];
int find(int x)//尋根 
{
if(x==f[x])
return x;
else
{
f[x]=find(f[x]);
return f[x];
}
}
void unio(int a,int b)//合併 
{
int nx=find(a);
int ny=find(b);
if(rand[nx]>rand[ny])     //有時候是f[nx]=ny而有時候是f[ny]=nx,傻傻分不清楚,後來知道可以按秩合併
f[ny]=nx;                 //秩即樹的高度
else
{
f[nx]=ny;
if(rand[nx]==rand[ny])
rand[ny]++;
}
}
int main()
{
int n,m,a,b;
while(~scanf("%d",&n),n)
{
scanf("%d",&m);
memset(d,0,sizeof(d));//陣列清零 
for(int i=1;i<=n;i++)
f[i]=i;//節點初始化,開始自己是自己的跟 
for(int i=1;i<=m;i++)
{   rand[i]==0;//覺得這裡應該是=,不知道為啥改成=就不對了。。。scanf("%d%d",&a,&b);
d[a]++;//記錄每個點度數 
d[b]++;
unio(a,b);
}
int root=0;
for(int i=1;i<=n;i++)
{
if(f[i]==i)
root++;
}
if(root!=1)//最後只有一個根節點 
{
printf("0\n");
continue;//進入下一組資料 
}
int faut=1;
for(int i=1;i<=n;i++)
{
if(d[i]%2!=0)//歐拉回路每個點的度數都是偶數 
{faut=0;
break;
}
}
if(faut==1)
printf("1\n");
else
printf("0\n");
}
return 0;
}