无向图的连通性

本文探讨了如何判断无向图的连通性,通过DFS或BFS遍历图,计数联通点来确定。同时介绍了割点的概念,即移除该点会导致图的连通性变化。定理表明,一个点是割点当且仅当其存在子节点,该子节点及其后代无法通过其他路径返回源点。文中提供了基于DFS的割点查找算法,通过访问顺序和搜索深度判断割点,并给出了详细的实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连通性的判断:

可以用dfs遍历整个图,用一个count计数联通点的数量,如果count等于n,那么整个图就是连通的,那么就是我们要找的就是用什么方法,可以用dfs或者bfs,大体思路就是从一个点开始找,先判断是否遍历过,没有就找到它的关系点,再从关系点dp,遍历后将count加一,向下访问,如果连通就会遍历到所有点即count=n

int count = 0;
void dfs(Map G, int i)
{
    int j = 0;
    visited[i] = 1;
    count++;
    for(j=0; j<G.num; j++)
    {
        if(G.map[i][j]==1 && !visited[j])//i和j有关系相邻,并且j顶点没有被访问过
        {
            dfs(G, j);
        }
    }
}

 

寻找割点/割边:

割点:定义就是如果把这个点从图中去掉,图的连通性被改变,这样的点就叫做割点                                                                      

定理:1.如果一个点是割点,那么它存在一个子节点V,V和V的后代点都没有其他路回到割点的源点。                                                     2. 根节点如果有两个以上的子树,那么它就是一个割点

思路:

选择dfs从一个点开始搜,每次操作先把操作的深度给赋值到low num 再初始化孩子的数量为0,遍历每一个子节点,若果没访问过就先进行dfs(v,u),更新值判断割点

用num[n]表示dfs对点的访问顺序,搜索深度越大num[u]越大                                                                                                             用low[n]表示是否V点有回退边回到U的源点                                                                                                                                       详细的操作看代码

#include<iostream>

using namespace std;
int low[105],num[105],dfn=0;
bool iscut[105];     //是否割点
vector<int>G[105];   //vector存图

void dfs(int u,int f){  //f为u父节点
	low[u]=num[u]=++dfn;
	int child=0;
	int i,j;
	for(i=0;i<G[u].size();i++){ //对每一个子节点都要操作
		int v=G[u][i];
		if(!num[v]){    //未访问过此子
			child++;
			dfs(v,u);
			low[u]=min(low[u],low[v]); //用后代更新low[u]的值
			if(low[v]>=num[u]&&u!=1) 
			iscut[u]=true;     //标记割点
		}
		else if(num[v]<num[u]&&v!=f) low[u]=min(low[u],num[v]);
	}
	if(u==1&&child>=2)//根节点
		iscut[1]=true;
}



 

 

          

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值