返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++的无向图是什么
  • 823
分享到

C++的无向图是什么

2023-06-17 13:06:30 823人浏览 薄情痞子
摘要

本篇内容介绍了“c++的无向图是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!无向图要是在纸上随便画画,或者只是对图做点示范性的说明,大

本篇内容介绍了“c++的无向图是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

无向图

要是在纸上随便画画,或者只是对图做点示范性的说明,大多数人都会选择无向图。然而在计算机中,无向图却是按照有向图的方法来储存的——存两条有向边。实际上,当我们说到无向的时候,只是忽略方向——在纸上画一条线,难不成那线“嗖”的就出现了,不是从一头到另一头画出来的? 无向图有几个特有的概念,连通分量、关节点、最小生成树。下面将分别介绍,在此之前,先完成无向图类的基本操作。

无向图类

template <class name, class dist, class mem>  class Graph : public Network {  public:  Graph() {}  Graph(dist maxdist) : Network (maxdist) {}  bool insertE(name v1, name v2, dist cost)  {  if (Network::insertE(v1, v2, cost))  return Network::insertE(v2, v1, cost);  return false;  }  };

仅仅是添加边的时候,再添加一条反向边,很简单。

连通分量

这是无向图特有的,有向图可要复杂多了(强、单、弱连通),原因就是无向图的边怎么走都行,有向图的边好像掉下无底深渊就再也爬不上来了。有了DFS,求连通分量的算法就变得非常简单了——对每个没有访问的顶点调用DFS就可以了。

void components()  {  visited = new bool[vNum()]; int i, j = 0;  for (i = 0; i < vNum(); i++) visited[i] = false;  cout << "Components:" << endl;  for (i = 0; i < vNum(); i++)  {  if (!visited[i]) { cout << '(' << ++j << ')'; DFS(i); cout << endl; }  }  delete []visited;  }

关节点

下定义是人们认识事物的一个方法,因为概念使得人们能够区分事物——关于这个还有个绝对的运动和相对的静止的哲学观点(河水总在流,但是长江还叫长江,记得那个著名的“不可能踏进同一条河里”吗?)因此,能否有个准确的概念往往是一门学科发展程度的标志,而能否下一个准确的定义反映了一个人的思维能力。说这么多废话,原因只有一个,我没搞清楚什么叫“关节点”——参考书有限,不能仔细的考究了,如有误解,还望指正。

严版是这么说的:如果删除某个顶点,将图的一个连通分量分割成两个或两个以上的连通分量,称该顶点为关节点。——虽然没有提到图必须是无向的,但是提到了连通分量已经默认是无向图了。

殷版是这么说的:在一个无向连通图中,……(余下同严版)。

问题出来了,非连通图是否可以讨论含有关节点?我们是否可以说某个连通分量中含有关节点?遗憾的是,严版留下这个问题之后,在后面给出的算法是按照连通图给的,这样当图非连通时结果就是错的。殷版更是滑头,只输出重连通分量,不输出关节点,自己虽然假定图是连通的,同样没有连通判断。

翻翻离散数学吧,结果没找到什么“关节点”,只有“割点”,是这样的:一个无向连通图,如果删除某个顶点后,变为非连通图,该顶点称为割点。权当“割点”就是“关节点”,那么算法至少也要先判断是否连通吧?可是书上都直接当连通的了……

关于算法不再细说,书上都有。下面的示例,能输出每个连通分量的“关节点”(是不是可以这样叫,我也不清楚)。dfn储存的是每个顶点的访问序号,low是深度优先生成树上每个非叶子顶点的子女通过回边所能到达的顶点最小的访问序号。把指向双亲的边也当成回边并不影响判断,因此不必特意区分,殷版显式区分了,属于画蛇添足。这样一来,if (low[n] >= dfn[i]) cout << getV(i);这个输出关节点的判断中的>=就显得很尴尬了,因为只能等于不可能大于。还要注意的是,生成树的根(DFS的起始点)是单独判断的。

void articul()  {  dfn = new int[vNum()]; low = new int[vNum()]; int i, j = 0, n;  for(i = 0; i < vNum(); i++) dfn[i] = low[i] = 0;//初始化  for (i = 0; i < vNum(); i++)  {  if (!dfn[i])  {  cout << '(' << ++j << ')'; dfn[i] = low[i] = count = 1;  if ((n = nextV(i)) != -1) articul(n); bool out = false;//访问树根  while ((n = nextV(i, n)) != -1)  {  if (dfn[n]) continue;  if (!out) { cout << getV(i); out = true; }//树根有不只一个子女  articul(n);//访问其他子女  }  cout << endl;  }  }  delete []dfn; delete []low;  }   private:  void articul(int i)  {  dfn[i] = low[i] = ++count;  for (int n = nextV(i); n != -1; n = nextV(i, n))  {  if (!dfn[n])  {  articul(n);  if (low[n] < low[i]) low[i] = low[n];  if (low[n] >= dfn[i]) cout << getV(i);//这里只可能=  }  else if (dfn[n] < low[i]) low[i] = dfn[n];//回边判断  }  }  int *dfn, *low, count;

“C++的无向图是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++的无向图是什么

本文链接: https://lsjlt.com/news/289374.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++的无向图是什么
    本篇内容介绍了“C++的无向图是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!无向图要是在纸上随便画画,或者只是对图做点示范性的说明,大...
    99+
    2023-06-17
  • C#图表算法之无向图
    目录1.相关术语2.表示无向图的数据结构3.图的处理算法的设计模式4.深度优先搜索5.寻找路径实现6.广度优先搜索实现7.连通分量实现union-find 算法8.符号图实...
    99+
    2024-04-02
  • C++中怎么利用LeetCode克隆无向图
    这期内容当中小编将会给大家带来有关C++中怎么利用LeetCode克隆无向图,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。[LeetCode] 133. Clone Graph 克隆无向图Given&nb...
    99+
    2023-06-20
  • C++实现LeetCode(133.克隆无向图)
    [LeetCode] 133. Clone Graph 克隆无向图 Given a reference of a node in a connected ...
    99+
    2024-04-02
  • Java这么实现无向图
    这篇文章主要介绍了Java这么实现无向图的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java这么实现无向图文章都会有所收获,下面我们一起来看看吧。基本概念图的定义一个图是由点集V={vi} 和&nb...
    99+
    2023-06-29
  • SAP CDS重定向视图是什么
    SAP CDS重定向视图是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。脚本假设我们有一个数据库表a,然后我们为它创建一个CDS重定向视图B,那么每次对表a执行读开放SQL...
    99+
    2023-06-04
  • C#反向引用构造是什么
    这篇文章主要介绍“C#反向引用构造是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#反向引用构造是什么”文章能帮助大家解决问题。反向引用构造反向引用允许在同一正则表达式中随后标识以前匹配的子表...
    99+
    2023-06-17
  • C语言怎么寻找无向图两点间的最短路径
    这篇文章主要讲解了“C语言怎么寻找无向图两点间的最短路径”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言怎么寻找无向图两点间的最短路径”吧!1.简介无向图是图结构的一种。本次程序利用邻接...
    99+
    2023-06-08
  • C++图的拓扑排序是什么
    本文小编为大家详细介绍“C++图的拓扑排序是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++图的拓扑排序是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、前言且该序列必须满足下面两个条件:每个顶点...
    99+
    2023-06-30
  • Java中无权无向图的示例分析
    这篇文章主要介绍了Java中无权无向图的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、图的定义我们知道,前面讨论的数据结构都有一个框架,而这个框架是由相应的算法实...
    99+
    2023-06-28
  • C#.NET中的AutoCAD向导和Editor类是什么
    这篇文章主要讲解了“C#.NET中的AutoCAD向导和Editor类是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#.NET中的AutoCAD向导和Editor类是什么”吧!1) ...
    99+
    2023-06-17
  • php图片旋转方向代码是什么
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php图片旋转方向代码是什么?php实现图片旋转最近有一个需求需要将前端上传过来的图片进行逆时针旋转90°,这个主要需要使用到php的imagerotate方法对于图...
    99+
    2024-04-02
  • C++中的面向对象编程概念是什么
    本篇文章给大家分享的是有关C++中的面向对象编程概念是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一.对象(Object),这个概念可以说是面向对象里面的最为核心的概念,...
    99+
    2023-06-17
  • SpringMVC视图转发重定向区别是什么
    这篇文章主要介绍了SpringMVC视图转发重定向区别是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringMVC视图转发重定向区别是什么文章都会有所收获,下面我们一起来看看吧。SpringMVC视图...
    99+
    2023-06-30
  • C++中面向对象编程指的是什么意思
    C++中的面向对象编程指的是一种程序设计范式,其中程序由对象组成,每个对象包含数据和操作数据的函数。面向对象编程的核心概念包括封装(...
    99+
    2024-03-11
    C++
  • Java实现无向图的示例详解
    目录基本概念图的定义无向图的定义无向图的 API无向图的实现方式邻接矩阵边的数组邻接表数组无向图的遍历深度优先搜索广度优先搜索后记基本概念 图的定义 一个图是由点集V={vi}&nb...
    99+
    2024-04-02
  • C语言面向对象编程中的封装是什么
    这篇文章主要介绍“C语言面向对象编程中的封装是什么”,在日常操作中,相信很多人在C语言面向对象编程中的封装是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言面向对象编程中的封装是什么”的疑惑有所帮助!...
    99+
    2023-06-29
  • c语言反向输出字符串的方法是什么
    在C语言中,反向输出字符串的方法可以通过以下步骤实现:1. 首先,计算字符串的长度。可以使用标准库函数strlen来获取字符串的长度...
    99+
    2023-09-08
    c语言
  • C#面向对象编程中的开闭原则是什么
    这篇“C#面向对象编程中的开闭原则是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#面向对象编程中的开闭原则是什么”文...
    99+
    2023-07-02
  • c语言回调函数双向链表指的是什么
    C语言回调函数双向链表指的是一种数据结构,它是由多个节点组成的链式结构。每个节点包含了数据域和两个指针,分别指向前一个节点和后一个节...
    99+
    2023-10-18
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作