#include <stdio.h>
#include<stdlib.h>
#define VERTICES 6
void initialise(int parent[]){
int i;
for ( i = 0; i < VERTICES; i++ ){
parent[i] = -1;
}
}
int find_root(int x , int parent[]){
int x_root = x;
while( parent[x_root] != -1 ){
x_root = parent[x_root];//查找父节点
}
return x_root;
}
/*
合并节点
返回1:合并成功
返回0:合并失败
*/
int union_vertices(int x, int y, int parent[]){
int x_root = find_root(x , parent);
int y_root = find_root(y , parent);
if( x_root = y_root ){//查找到的根相同
return 0;
}else{
parent[x_root] = y_root;//x的父节点设置成y
return 1;
}
}
int main(){
int parent[VERTICES] = {0};
int edges[6][2] = { {0,1},{1,2},{1,3},{2,4},{3,4},{2,5} };
initialise(parent);
int i;
for( i = 0 ;i < 6; i++ ){
int x = edges[i][0];//第i条边的第0个数字
int y = edges[i][1];//第i条边的第1个数字
if(union_vertices(x,y,parent) == 0){
printf("图中存在有环!");
exit(0);
}
}
printf("图中不存在环!");
return 0;
}
优化版本
#include <stdio.h>
#include<stdlib.h>
#define VERTICES 6
void initialise(int parent[] , int rank[]){
int i;
for ( i = 0; i < VERTICES; i++ ){
parent[i] = -1;
rank[i] = 0;
}
}
int find_root(int x , int parent[]){
int x_root = x;
while( parent[x_root] != -1 ){
x_root = parent[x_root];//查找父节点
}
return x_root;
}
/*
合并节点
返回1:合并成功
返回0:合并失败
*/
int union_vertices(int x, int y, int parent[], int rank[]){
int x_root = find_root(x , parent);
int y_root = find_root(y , parent);
if( x_root = y_root ){//查找到的根相同
return 0;
}else{
//parent[x_root] = y_root;//x的父节点设置成y
if(rank[x_root] > rank [y_root]){
parent[y_root] = x_root;
}
else if(rank[x_root] < rank [y_root]){
parent[x_root] = y_root;
}else{
rank[y_root++];
parent[x_root] = y_root;
}
return 1;
}
}
int main(){
int parent[VERTICES] = {0};
int rank[VERTICES] = {0};
int edges[6][2] = { {0,1},{1,2},{1,3},{2,4},{3,4},{2,5} };
initialise(parent , rank);
int i;
for( i = 0 ;i < 6; i++ ){
int x = edges[i][0];//第i条边的第0个数字
int y = edges[i][1];//第i条边的第1个数字
if(union_vertices(x,y,parent,rank) == 0){
printf("图中存在有环!");
exit(0);
}
}
printf("图中不存在环!");
return 0;
}