HDOJ 1878 欧拉回路 nyoj 42一笔画问题

时间:2022-05-07 20:18:38
 #include<cstdio>
#include<cstring>
int visited[];
int find(int x)
{
if(visited[x]!=x)
return find(visited[x]);
return x;
}
void make(int a,int b)
{
int f1=find(a);
int f2=find(b);
if(f1!=f2)
visited[f2]=f1;
} int main()
{
int a[];
int n,m,i,j,x,y;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d",&m);
int key=;
memset(a,,sizeof(a)); for(i=;i<=n;i++)
{
visited[i]=i;
}
for(i=;i<m;i++)
{
scanf("%d %d",&x,&y);
make(x,y);
a[x]++;
a[y]++;
}
if(m<n-)
printf("0\n");
else
{ int root=find();
for(i=;i<=n;i++)
{
if(a[i]%!=||find(i)!=root)
{
key=;
break;
}
}
if(key)
printf("1\n");
else
printf("0\n");
}
}
return ;
}

1、每个顶点的度为偶数。

2、每个顶点都相连。(m>=n-1)

 #include<stdio.h>
#include<string.h>
int pa[];
int find(int x)
{
if(x!=pa[x])
pa[x]=find(pa[x]);
return pa[x];
}
void un(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
pa[x]=y;
}
int main()
{
int t,p,q,i,a,b,node[],f,sum,root;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&p,&q);
for(i=;i<=p;i++)
{
pa[i]=i;
node[i]=;
}
for(i=;i<=q;i++)
{
scanf("%d %d",&a,&b);
un(a,b);
node[a]++;
node[b]++; }
sum=;
f=;
root=find();
for(i=;i<=p;i++)
{
if(root!=find(i))
{
f=;
break;
}
if(node[i]%!=)
sum++;
}
if(sum==&&f==||sum==&&f==)
printf("Yes\n");
else
printf("No\n");
}
return ;
}

欧拉回路或欧拉通路。