【杭電1878】歐拉回路
阿新 • • 發佈:2019-01-26
歐拉回路
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d
& %I64u
束。
每個測試用例的輸出佔一行,若歐拉回路存在則輸出1,否則輸出0。
Description
歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路?Input
測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。當N為0時輸入結束。
Output
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;
}