hdu 1878 欧拉回路
判断一个无向图有没有欧拉回路。注意要先判断图有没有连通。我用并查集判断。
46MS:
#include <stdio.h>
#include <string.h>
int parent[1001];
int f(int x)
{
int r=x;
while(parent[r]>=0)
r=parent[r];
while(x!=r)
{
int t=parent[x];
parent[x]=r;
x=t;
}
return r;
}
void merge(int x,int y)
{
int p,q;
p=f(x);
q=f(y);
if(p!=q)
{
int n1=parent[p],n2=parent[q];
// parent[p]=q;
if(n1>n2)//-3>-4
{
parent[p]=q;
parent[q]=n1+n2;
}
else
{
parent[q]=p;
parent[p]=n1+n2;
}
}
}
int main()
{
int n,i,b,c,m,k,a[1001];
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
k=0;
for(i=1;i<=n;i++)
parent[i]=-1;
memset(a,0,sizeof(a));
for(i=0;i<m;i++)
{
scanf("%d %d",&b,&c);
a[b]++;a[c]++;
merge(b,c);
}
for(i=1;i<=n;i++)
{
if(parent[i]<0)
{
k++;
if(k>1) break;
}
//看有没有孤立点或奇度顶点,有则令b=0
if(a[i]==0||a[i]%2!=0)
{
b=0;
break;
}
}
//k=1则图连通
if(b!=0&&k==1)
printf("1\n");
else
printf("0\n");
}
return 0;
}
浙公网安备 33010602011771号