题目
可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学。这个问题如今可以描述为判断欧拉回路是否存在的问题。欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个无向图,问是否存在欧拉回路?
代码
/*
本题代码用于解决,PTA上一题,哥尼斯堡"七桥"问题(寻找欧拉回路).
采用算法:并查集.
欧拉回路的计算方法(途中各个定点相互连通,且所有定点的度为偶数)
*/
#include<stdio.h>
#include<stdlib.h>
#define N 1000
int find(int x);
void merge(int x,int y);//采用并查集
int degree[N],fa[N];
void main(){
int i,n,x,j;
int vi,vj;
int count=0,cn=0;
scanf("%d",&n);
scanf("%d",&x);
//fa[]初始化
for(i=1;i<=n;i++)
fa[i]=i;
//degree[]初始化
for(i=1;i<=n;i++)
degree[i]=0;
//图输入边
while( (x--) >0 ){
scanf("%d",&vi);
scanf("%d",&vj);
degree[vi]++;
degree[vj]++;
merge(vi,vj);
}
for(i=1;i<=n;i++)
if(degree[i]%2!=0)
cn++;
for(i=1;i<=n;i++){
if(fa[i]==i)
count++;
}
if(count>1||cn>0){
printf("0 \n");
}
else
printf("1 \n");
system("pause");
}
int find(int x){
if(fa[x]==x)
return x;
else
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
int tempx,tempy;
tempx=fa[x];
tempy=fa[y];
fa[tempx]=tempy;
}
并查集概述
核心代码
int find(int x){
if(fa[x]==x)
return x;
else
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
int tempx,tempy;
tempx=fa[x];
tempy=fa[y];
fa[tempx]=tempy;
}