hdu1878 欧拉回路(并查集+无向图欧拉回路)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20997 Accepted Submission(s): 8152
Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
束。
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
Sample Output
1
0
首先用并查集判断是不是连通图,无向图是欧拉回路的判断方法是每个点都是偶点(偶点是无向图中度为偶数的点)
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n,m; 5 const int N=1005; 6 int G[N][N]; 7 int degree[N]; 8 int fa[N]; 9 10 void init(){ 11 memset(G,0,sizeof G); 12 memset(degree,0,sizeof degree); 13 for(int i=1;i<N;i++){ 14 fa[i]=i; 15 } 16 } 17 18 int find(int x){ 19 while(x!=fa[x]){ 20 x=fa[x]; 21 } 22 return x; 23 } 24 25 void Union(int x,int y){ 26 int fx=find(x),fy=find(y); 27 if(fx!=fy){ 28 fa[fx]=fy; 29 } 30 } 31 32 int main(){ 33 int x,y; 34 while(cin>>n,n){ 35 cin>>m; 36 init(); 37 for(int i=0;i<m;i++){ 38 scanf("%d%d",&x,&y); 39 if(G[x][y]==0&&G[y][x]==0){ 40 G[x][y]=G[y][x]=1; 41 degree[x]++; 42 degree[y]++; 43 Union(x,y); 44 } 45 } 46 int flag=1; 47 int rt=find(1); 48 for(int i=2;i<=n;i++){ 49 if(find(i)!=rt){ 50 flag=0; 51 break; 52 } 53 } 54 if(flag==0){ 55 printf("%d\n",flag); 56 continue; 57 } 58 for(int i=1;i<=n;i++){ 59 if(degree[i]%2==1){ 60 flag=0; 61 break; 62 } 63 } 64 printf("%d\n",flag); 65 } 66 }