本文主要是介绍hdu——1878——欧拉路(并查集),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
束。
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
1 0
并查集:把分散的点构成一个集合,找共同的根。
欧拉回路
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条 边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。
判断欧拉路是否存在的方法:
有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。
无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
判断欧拉回路是否存在的方法:
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。
#include <iostream>
#include <stdio.h>
#define M 1007
using namespace std;
int n,m;
int pre[M],deg[M];
int init()
{for(int i=1;i<=n;i++){deg[i]=0;pre[i]=i;}
}
int find(int x)
{ while(x!=pre[x])x=pre[x];return x;
}
void unio(int x,int y)
{pre[y]=find(x);
}
int main()
{while(scanf("%d",&n),n){cin>>m;init();int a,b;while(m--){scanf("%d%d",&a,&b);deg[a]++;deg[b]++;if(find(a)!=find(b))unio(a,b);}int flag=0;for(int i=1;i<n;i++){if(deg[i]%2){flag=1;printf("0\n");break;}}if(flag)continue;int t=pre[1];for(int i=2;i<=n;i++){if(t!=find(i)){flag=1;break;} }if(flag)printf("0\n");elseprintf("1\n");}return 0;
}
这篇关于hdu——1878——欧拉路(并查集)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!