解题思路:即为满足欧拉回路的两个条件就可以了 (1)是连通图(2)顶点度数为偶数
用并查集写的版本--
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int degree[10010],pre[10010]; int find(int root){ return root == pre[root] ? root : pre[root] = find(pre[root]); } void unionroot(int x,int y) { int root1=find(x); int root2=find(y); if(root1!=root2) pre[root1]=root2; } int main() { int m,n,u,v,i; while(scanf("%d %d",&n,&m)!=EOF&&n) { int flag=1; memset(degree,0,sizeof(degree)); for(i=1;i<=10010;i++) pre[i]=i; for(i=1;i<=m;i++) { scanf("%d %d",&u,&v); degree[u]++; degree[v]++; unionroot(u,v); } for(i=1;i<=n;i++) { if(degree[i]!=2) { flag=0; break; } if(find(i)!=find(n)) { flag=0; break; } } if(flag) printf("1 "); else printf("0 "); } }
用邻接矩阵储存图,用DFS遍历版本--
因为对于一个环,只需深度搜索一遍,则所有的点就已经被标记了,如果还有点没有被标记,那么就说明不构成环,再就是还是要满足顶点的度数为偶数
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int d[1005][1005],vis[1005],degree[1005]; void dfs(int u,int n) { int i=1; vis[u]=1; for(i=1;i<=n;i++) { if(d[u][i]&&vis[i]==0) dfs(i,n); } } int main() { int n,m,i,j,ans,u,v,flag; while(scanf("%d %d",&n,&m)!=EOF&&n) { memset(d,0,sizeof(d)); memset(vis,0,sizeof(vis)); memset(degree,0,sizeof(degree)); flag=1; for(i=1;i<=m;i++) { scanf("%d %d",&u,&v); d[u][v]=d[v][u]=1; degree[u]++; degree[v]++; } dfs(1,n); for(i=1;i<=n;i++) { if(vis[i]==0) { flag=0; break; } if(degree[i]%2) { flag=0; break; } } if(flag) printf("1 "); else printf("0 "); } }