一笔画问题
欧拉回路的思路是先判断是否连通(用并查集或dfs),其次再判断度,若为无向图,每一个顶点的度皆应为偶数;若为有向图,每一个顶点的度应为0.
#include<iostream>
#include<cstring>
using namespace std;
const int N=1001;
int pre[N];//并查集
int ans[N];//记录每个顶点的度数量
int Find(int a){
while(pre[a]!=a)
a=pre[a];
return a;
}
void Union(int a,int b){
int fa=Find(a);
int fb=Find(b);
pre[fa]=fb;
}
int main(){
int n,m;
while((cin>>n>>m)&&n){
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
ans[a]++;
ans[b]++;
Union(a,b);
}
int flag=1,num=0;
for(int i=1;i<=n;i++)
if(pre[i]==i)
num++;
if(num!=1)
flag=0;
for(int i=1;i<=n;i++)
if(ans[i]%2==1){
flag=0;
break;
}
if(flag)
cout<<1<<endl;
else
cout<<0<<endl;
}
}
此题为无向图的一笔画问题,有向图的一笔画问题可参考hdu1116