#include<iostream>
using namespace std;
/*
用并查集判断一个图有几个连通分量(图用连接矩阵表示)
*/
#define N 9 //连接矩阵的大小
int g[N][N]={0};
int ComponenCount(int g[N][N]){
//g[N][N]是二维数组表示的连接矩阵
int S[N]; //定义、初始化并查集
for( int i = 0;i < N;i++){
S[i] = -1; //初始化
}
//遍历各条边,无向图,只需要遍历上三角部分即可
for(int i = 0; i < N;i++){
for( int j = i + 1; j < N ;j++){
if(g[i][j] > 0){ //说明i,j之间有边
int iroot = Find(S,i);//通过并查集找到i所在的集合
int jroot = Find(S,j); //通过并查集找到i所在的集合
if(iroot != jroot){//i,j并入同一个集合
Union(S,iroot,jroot);
}
}
}
//统计有几个连通分量
int count = 0;//用于计数,初始为0
for(int i = 0;i < N;i++){
if(S[i] < 0 ){ //因为初始化为-1,小于0表示这是个根结点
count++; //统计
}
}
return count;
}
/*
用并查集判断一个图有是否有环(图用连接矩阵表示)
*/
int hasAcyclic(int g[N][N]){
//g[N][N]是二维数组表示的连接矩阵
int S[N]; //定义、初始化并查集
for( int i = 0;i < N;i++){
S[i] = -1; //初始化
}
//遍历各条边,无向图,只需要遍历上三角部分即可
for(int i = 0; i < N;i++){
for( int j = i + 1; j < N ;j++){
if(g[i][j] > 0){ //说明i,j之间有边
int iroot = Find(S,i);//通过并查集找到i所在的集合
int jroot = Find(S,j); //通过并查集找到i所在的集合
if(iroot != jroot){//i,j并入同一个集合
Union(S,iroot,jroot);
}
else{ //i,j原本就在同一个集合中,即原本就是连通
return 1; //在连通子图中,但凡再多一条边,必有环
}
}
}
}
return 0; // 图中没有环
}
int main(){
return 0;
}
并查集应用--判断图的连通分量和判断图是否有环
最新推荐文章于 2023-03-18 02:38:14 发布
本文介绍如何使用并查集算法判断无向图的连通分量数量及是否存在环。通过遍历图的边,实现节点的合并,并统计根节点数量以确定连通分量数目;同时,检查在合并过程中是否遇到已存在于同一集合中的节点来判断环的存在。

3万+

被折叠的 条评论
为什么被折叠?



