判断图连通性的三种方法

2023-11-06

       在看哥尼斯堡七桥问题的时候,谈到欧拉回路的问题,不免又想到了图的连通性。想到以后说不定会遇到相关问题,就做下连通性判断算法总结实现。如果一个图是连通的,那么从一个节点开始访问,采用深度优先或者广度优先对它进行遍历,那么必定能够访问完所有的节点。还有一种方法,就是使用图的邻接矩阵的传递闭包。下面是三种方法的实现代码。

#include<iostream>
#include<queue>
#include <stdio.h>

using namespace std;

#define MAX_VNUM 10

typedef struct
{
 int weight;
}Adj,AdjMatrix[MAX_VNUM][MAX_VNUM];

typedef struct
{
 AdjMatrix adjM;
 int vNum;
}adjGraph;

//创建一个图,节点从0开始,注意传入引用
void CreateGraph(adjGraph &G)
{
 cout<<"输入节点个数:"<<endl;
 cin>>G.vNum;
 cout<<"输入图的邻接矩阵:"<<endl;
 for (int i=0;i<G.vNum;i++)
 {
  for (int j=0;j<G.vNum;j++)
  {
   cin>>G.adjM[i][j].weight;
  }
 }
}

//输出一个图
void print(adjGraph G)
{
 for(int i=0;i<G.vNum;i++)
 {
  for(int j=0;j<G.vNum;j++)
  {
   cout<<G.adjM[i][j].weight<<" ";
  }
  cout<<endl;//将换行流写入输出流,清空输出缓冲区
 }
}


//warshall算法判断图的连通性
bool connectivityWarshall(adjGraph G)
{
 adjGraph temp;//临时判断矩阵
 temp.vNum = G.vNum;

 //初始化临时判断矩阵
 for (int i =0;i<temp.vNum;i++)
 {
  for(int j=0;j<temp.vNum;j++)
  {
   if (G.adjM[i][j].weight)
    temp.adjM[i][j].weight = 1;
   else
    temp.adjM[i][j].weight = 0;

  }
  temp.adjM[i][i].weight = 1;
 }

 //矩阵乘法算法Warshall,R(a)
 for (int a =0;a<temp.vNum;a++)
 {
  for (int b=0;b<temp.vNum;b++)
  {
   if(temp.adjM[a][b].weight)
   {
    for (int c = 0;c<temp.vNum;c++)
    {
     if (temp.adjM[c][a].weight)
      temp.adjM[c][b].weight = 1;
    }
   }
  }
 }

 //进行判断
 for (int i=0;i<temp.vNum;i++)
 {
  for (int j=0;j<temp.vNum;j++)
  {
   if (!temp.adjM[i][j].weight)
    return false;
  }
 }

 return true;
}


//广度优先搜索判断连通性
bool connectivityBFS(adjGraph G)
{
 queue<int> q; //明白队列用途?
 bool visit[MAX_VNUM]; //访问数组
 int count = 0;

 memset(visit,0,sizeof(visit));

 q.push(0); //0节点入队列

 while(!q.empty())
 {
  int v = q.front();
  visit[v] = true;
  q.pop();
  count++;

  //与联通且没有被访问过节点入队列
  for (int i =0;i<G.vNum;i++)
  {
   if (G.adjM[v][i].weight)
   {
    if(!visit[i])
    {
     q.push(i);
    }
   }
  }
 }

 if (count == G.vNum) return true;
 else return false;

}

//深度优先搜索判断图的连通性,传递数组会改变值,visit需初始化
void dfs_visit(adjGraph G,int firstNode,bool visit[])
{
 visit[firstNode] = 1;

 for(int i=0; i<G.vNum;i++)
 {
  if(G.adjM[firstNode][i].weight & !visit[i])
   dfs_visit(G,i,visit);
 }
}

bool connectivityDFS(adjGraph G)
{
 bool visit[MAX_VNUM]; //访问数组
 memset(visit,0,sizeof(visit));
 dfs_visit(G,0,visit); //从0节点开始访问

 for(int i=0;i<G.vNum;i++)
 {
  if (visit[i] == false) return false;
 }

 return true;
}

int main()
{
 adjGraph G;
 CreateGraph(G);
 //print(G);

 if (connectivityWarshall(G)) cout<<"连通"<<endl;
 else cout<<"不连通"<<endl;
 system("pause");
 return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断图连通性的三种方法 的相关文章

  • Python 邻接矩阵实现无向图、有向图的三种方法,并绘图显示

    网上查了很多资料 发现主要是使用邻接表来实现图 并进行遍历的 而采用邻接矩阵的就非常少 不得已 就只有闭门造车 埋头苦修 小有成果 供后来学习者研究 通过二维数组建立无向图 通过二维数组建立有向图 通过边建立有向图 为方便查看 通过Netw
  • 图的构建和遍历

    图是一种包括节点和边的数据结构 本文对图的构建 图的遍历给出详细的代码 其中 图的表示方法有 邻接矩阵 邻接表 图的遍历方法有 深度优先搜索 DFS 广度优先搜索 BFS 1 图的表示 1 1 邻接矩阵 include
  • 弗洛伊德算法(floyd)

    算法背景 图中的A B C D E F G 代表7个村庄 边上的权值带表两村庄之间的距离 现在要从某一个村庄 例如G村庄 往另外几个村庄送邮件 问任意一村庄到其他各村庄的最短距离分别是多少 思路 该问题实际是求从任一顶点到其余顶点的最短距离
  • 数据结构--图的遍历

    数据结构 图的遍历 遍历的定义 从已给的连通图中某一顶点出发 沿着边访问图中所有的顶点 且使每个顶点只被访问一次 就叫做图的遍历 它是图的基本运算 遍历的实质是 找到每个顶点的邻接点的过程 图的特点 图中可能存在回路 且图中的任一顶点都可能
  • 图的创建和遍历

    图的定义 由顶点的有穷非空集合和顶点之间边的集合组成的数据类型 图的表示 G V E G表示一个图 V是图G的顶点集合 E为图G的边的集合 图的逻辑结构 多对多 图的存储结构 邻接矩阵 邻接表 十字链表 邻接多重表 图的一些无聊术语 顶点i
  • 完美匹配-匈牙利算法(Hungarian method Edmonds)讲解

    目录 匈牙利算法 Hungarian method Edmonds 例题1 有完美匹配 例题2 无完美匹配 代码实现 变量及函数说明 测试数据1 测试结果1 测试数据2 测试结果 匈牙利算法 Hungarian method Edmonds
  • 数据结构之图:无向图的介绍与功能实现,Python——22

    无向图 Undigraph 的介绍 引入 生活中的图 有地图 集成电路板的图 可以看类似的看做是数据结构中的图 数据有 一对一 一对多 和 多对多 的关系 前两种分别表示线性表和树的存储结构性质 而多对多则可表示图的存储结构性质 定义 图是
  • 图的常用遍历——广度优先遍历和深度优先遍历

    目录 一 遍历图可能遇到的问题 二 图的常用遍历 三 深度优先遍历 DFS 四 广度优先遍历 BFS 一 遍历图可能遇到的问题 图的特点 图中可能存在回路 且图的任一顶点都可能与其它顶点相通 在访问完某个顶点之后可能会沿着某些边又回到了曾经
  • 使用阿里云日志服务来分析日志

    随着云服务技术越来越成熟 作为一枚运维 不得不感慨云计算的发展对我的职业生涯起了积极推动的作用 一方面我可以通过云服务来提高我的工作效率 另一方面我节省了更多时间来学习 在提高我专业度的同时 个人能力也越来越强 在此我就以阿里云日志服务 给
  • 弗洛伊德算法(floyd)

    弗洛伊德算法和迪杰斯特拉算法都是求两点之间最短路径的问题 弗洛伊德算法使用了动态规划的思想 用二维矩阵记录了所有点之间最短的距离 虽然代码只有几行 但是思想还很值得回味的 其主要的思想就是两个点之间的直接距离能否使用第三个点来缩短 公式 v
  • uva 1601 The Morning after Halloween code2

    题目 The Morning after Halloween 题意 有n个用小写字母表示的鬼和一张地图 每个鬼都要移动到对应的大写字母 两个鬼的位置不能在一次移动中交换 问最少步数 思路 双向bfs 此题还可以单向bfs 见code1 1
  • 图和Neo4j

    文章来源 拉勾教育Java高薪训练营第3期 程道老师 1 图论 1 1 图论的起源 柯尼斯堡 Konigsberg 七桥问题 图论起源于一个非常经典的问题 柯尼斯堡 Konigsberg 七桥问题 1738 年 瑞典数 学家欧拉 Leorn
  • 迪杰斯特拉(Dijkstra)算法 Java实现(最短路径)

    基本思想 通过Dijkstra计算图G中的最短路径时 需要指定起点vs 即从顶点vs开始计算 此外 引进两个集合S和U S的作用是记录已求出最短路径的顶点 而U则是记录还未求出最短路径的顶点 以及该顶点到起点vs的距离 初始时 S中只有起点
  • 最小生成树算法之Prim算法

    生成树 一个连通图的生成树是一个极小连通子图 它含有图中全部n个顶点和构成一棵树的 n 1 条边 连通图由一次遍历就可以产生生成树 由深度优先遍历得到的生成树称为深度优先生成树 由广度优先遍历得到的生成树称为广度优先生成树 一个连通图的生成
  • 图的邻接矩阵存储

    public class Graph init public static int MAX GRAPH SIZE 256 最大顶点个数 public static int MAX WEIGHT 65536 图中最大权值 public int
  • 克鲁斯卡尔算法(kruskal)

    我自己感觉 克鲁斯卡尔算法比普利姆算法更好理解 它就两个要点 排序和判断是否成环 排序 我们把两两相邻的边根据边的权值 从小到大依次排序 这个十大排序算法可以自己选一个去实现下 刚好还可以回忆下以前的算法 下面我们使用冒泡来实现边的排序 是
  • 图的应用--Prim算法

    图的应用 Prim算法 Prim算法是一种基于顶点的贪心算法 从起始顶点出发 每次迭代选择当前可用的最小权值边 然后把边上依附的其他顶点加入最小生成树 prim算法可以称为 加点法 比较适合稠密图 算法思想 设G V E 是一个加权连通图
  • 图(一)之邻接表Adjacency List

    开始攻克图的算法 先从最简单的存储开始实现 本文关于邻接表的实现 邻接表是图的存储中最简单也是最基本的存储结构 基于链表的思想实现的 在邻接表中 对于中的每个顶点建立一个单链表 第i个单链表中的节点表示依附于顶点的vi的边 每个节点由3个域
  • [课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习

    作者最近在复习考博 乘此机会分享一些计算机科学与技术 软件工程等相关专业课程考题 一方面分享给考研 考博 找工作的博友 另一方面也是自己今后完成这些课程的复习资料 同时也是在线笔记 基础知识 希望对您有所帮助 不喜勿喷 无知 乐观 低调 谦
  • 迪杰斯特拉算法(Dijkstra)-Java实现

    迪杰斯特拉算法也是求两点之间最短路径的算法 它的思想和普利姆算法有点相似 不断通过已找到点集合和未找到点之间的集合之间的最短路径 这个算法需要用到三个数组 一个是存储结点是否已经访问 一个是结点到起始点的最短距离 还有一个是结点到起始点第一

随机推荐

  • STL(标准模板库)专题

    STL 标准模板库 专题 STL主要分为分为三类 容器 STL主要分为分为三类 algorithm 算法 对数据进行处理 解决问题 步骤的有限集合 container 容器 用来管理一组数据元素 Iterator 迭代器 可遍历STL容器内
  • 【C++】实现一个日期计算器

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 日期计算器的功能 二 获取每个月的天数 三 Date类
  • python答题系统的代码_答题辅助python代码实现

    本文实例为大家分享了答题辅助python具体代码 供大家参考 具体内容如下 from screenshot import pull screenshot import time urllib request try import Image
  • EasyPoi 导出表格并设置表头

    EasyPoi 导出表格 EasyPoiUtil 工具类 设置表头 NewExcelExportStylerDefaultImpl 工具类 VO实体类 对应的是表的列名 Controller 1 未设置表头版本 Controller 2 设
  • hp服务器能不能装win7系统,惠普 HPC0Q07PA可不可以装windows7系统_惠普 HPC0Q07PA怎么安装win7系统-win7之家...

    刚买了一台惠普 HPC0Q07PA笔记本电脑 想安装windows7系统 但不知道能不能安装 也不知道装完win7系统之后系统运行的流畅不流畅 小编特意查了下惠普 HPC0Q07PA笔记本的相关信息 跟大家分析下这个能不能安装win7系统
  • 点云的关键点检测-传统方法总结

    三维点云的关键点检测可以通过以下步骤实现 1 寻找局部区域 从点云中选择一个局部区域 2 估计曲率和法线 对局部区域进行曲率估计 并计算法向量 3 计算关键点 使用曲率和法线信息来计算点云的关键点 这可以通过计算曲率极值点 曲率变化最大点或
  • Vue里使用Element UI的Tabs時el-tab-pane的隱藏和顯示

    1 效果圖 隱藏相關項后
  • tensorflow与tflearn的安装时numpy无法更新问题

    对于老司机来说 这都不是事 但对于初学者来说 在安装看到python里import tflearn 在安装tensorflow还真遇到了问题 电脑 mac python版本2 7 直接运行 sudo pip install tensorfl
  • Linux系统中如何查看TCP连接数

    这篇文章主要为大家展示了 Linux系统中如何查看TCP连接数 内容简而易懂 条理清晰 希望能够帮助大家解决疑惑 下面让小编带领大家一起研究并学习一下 Linux系统中如何查看TCP连接数 这篇文章吧 一 查看哪些IP连接本机 netsta
  • raid配置ssd为缓存_群晖SSD缓存有什么用?

    作用 SSD 缓存功能 使用户可以通过添加 SSD 提高 Synology NAS 上的随机访问性能 功能模式 只读缓存 使用此类型的 SSD 缓存时 只会将经常访问的数据存储在 SSD 缓存中以提高随机读取速度 因为 SSD 不涉及任何数
  • stm32 IAP APP 相互跳转实验 (keil4 jlink STM32F407ZE)

    1 实验目标 STM32 IAP学习时 希望有一个快捷的方式去实验IAP与APP之间的相互跳转 1 验证IAP跳转至APP 2 验证APP通过软件reset跳转至IAP 避免再一开始就实验完整的IAP过程 编写BootLoader 编写 A
  • flutter 高德地图 amap_flutter_location 隐私合规校验失败

    flutter 高德地图 amap flutter location 隐私合规校验失败 提醒 ios版本他的最新库是没有办法使用的 如果你的项目需要使用到iOS版本 请使用下面的路径 https github com yangsiyi41
  • 微信开发(js-sdk)中遇见的各种问题

    微信开发的准备工作 不熟 不是我来搞的 copy一下别人和官方的 1 绑定域名 先登录微信公众平台进入 公众号设置 的 功能设置 里填写 JS接口安全域名 备注 登录后可在 开发者中心 查看对应的接口权限 2 引入js文件 在需要调用JS接
  • 动态路由协议RIP配置实战

    1 RIP简介 RIP是一种基于距离矢量 Distance Vector 算法的协议 它使用跳数 Hop Count 作为度量值来衡量到达目的地址的距离 在RIP网络中 RIP协议要求网络中每一台路由器都要维护从自身到每一个目的网络的路由信
  • Kettle-动态数据链接,使JOB得以复用

    动态数据连接 使JOB得以复用 背景 移动执法系统在目前的主要的部署策略为1 N的方式 即总队部署一套 地市各部署一套 且基本都在环保专网 各地市的业务数据需要推送到总队系统 以便总队系统做整体的监督 决策 在整个数据对接过程中 基于Ket
  • Matlab导入txt文件

    有三种常见的方式 1 A importdata filename txt 则A就是n m的矩阵了 2 load filename txt 这样也是载入n m的矩阵 3 在MATLAB的work文件夹下 选择想要导入的数据 用右键import
  • 前端系列-1 HTML+JS+CSS基础

    背景 前端系列会收集碎片化的前端知识点 作为自己工作和学习时的字典 欢迎读者收藏和使用 笔者是后端开发 前端涉猎不深 因此文章重在广度和实用 对原理和性能不会过多深究 1 html 1 1 html5网页结构
  • 如何判断两条线段是否相交

    本篇是在 C 笔记 如何判断2个线段相交 的基础上加上自己的理解和实践总结出的判断两线段是否相交的方法 判断两条线段是否相交 先附上判断函数 bool judge int Ax1 int Ay1 int Ax2 int Ay2 int Bx
  • vue3的ref,unref,reactive,toRefs,toRef

    ref函数 接受一个初始值并返回一个响应式且可变的 ref 对象 ref 对象仅有一个 value属性 指向该初始值 const count ref 0 console log count value 0 count value conso
  • 判断图连通性的三种方法

    在看哥尼斯堡七桥问题的时候 谈到欧拉回路的问题 不免又想到了图的连通性 想到以后说不定会遇到相关问题 就做下连通性判断算法总结实现 如果一个图是连通的 那么从一个节点开始访问 采用深度优先或者广度优先对它进行遍历 那么必定能够访问完所有的节