1、无向图的连通性

运用深度优先搜索或广度优先搜索遍历无向图可以分析图的连通性。可通过额外设置计数器count(初始值0)统计出图的连通分量,每调用一次,计数器count增1。当遍历完无向图时,若count=1,则图连通,若count>1,图非连通,count的值就是该图的连通分量数。

#include <iostream>
using namespace std;
#define INFINITY  65535 /* 表示权值的无穷*/
typedef int EdgeType;//边上的权值类型
typedef int VertexType;//顶点类型
const int MaxSize=100;
int visited[MaxSize];//全局标识数组
//无向图邻接表。边表结点结构
struct EdgeNode
{int adjvex;//邻接点域EdgeNode *next;//指向下一个边结点的指针
};
//无向图邻接表。表头结点结构
struct VexNode
{VertexType vertex;//顶点EdgeNode *firstedge;//边表的头指针
};
//邻接表类
class ALGraph
{public:ALGraph()//无参构造函数{vertexNum=0;edgeNum=0;for(int i=0;i<MaxSize;i++)adjlist[i].firstedge=NULL;}ALGraph(VertexType a[],int n);//有参构造函数void createGraph(int start, int end);//创建图,采取前插法void DFSL(int v);//从v出发深度优先遍历可达顶点递归函数void DFSL1(int v);//从v出发深度优先遍历可达顶点的非递归函数void displayGraph(int nodeNum);//打印void CountComp(ALGraph g);//求连通分量数,判断图的连通性private:VexNode adjlist[MaxSize];//存放顶点表的数组int vertexNum,edgeNum;//图的顶点数和边数
};
//有参构造函数。构造顶点表
ALGraph::ALGraph(VertexType a[],int n)
{vertexNum=n;edgeNum=0;for(int i=0;i<vertexNum;i++){adjlist[i].vertex=a[i];adjlist[i].firstedge=NULL;}
}
//创建图,采取前插法
void ALGraph::createGraph(int start, int end)
{//边(start,end)//adjlist[start].vertex=start;//表头结点中的顶点EdgeNode *p=new EdgeNode;//边结点p->adjvex=end;//邻接点//p->weight=weight;p->next=adjlist[start].firstedge;//前插法插入边结点padjlist[start].firstedge=p;
}
//打印存储的图
void ALGraph::displayGraph(int nodeNum)
{int i,j;EdgeNode *p;for(i=0;i<nodeNum;i++){p=adjlist[i].firstedge;while(p){cout<<'('<<adjlist[i].vertex<<','<<p->adjvex<<')'<<endl;p=p->next;}}
}
//从v出发深度优先遍历可达顶点递归函数
void ALGraph::DFSL(int v)
{int n=vertexNum;int j;EdgeNode *p;if(v>=n||v<0) throw "位置出错";cout<<adjlist[v].vertex<<" ";visited[v]=1;p=adjlist[v].firstedge;while(p){j=p->adjvex;//顶点if(visited[j]==0) DFSL(j);p=p->next;}
}
//从v出发深度优先遍历可达顶点的非递归函数
void ALGraph::DFSL1(int v)
{int S[MaxSize],top=-1,j,n=vertexNum;EdgeNode *p;if(v>=n||v<0) throw "位置出错";cout<<adjlist[v].vertex<<" ";visited[v]=1;S[++top]=v;//v进栈while(top!=-1){v=S[top--];//栈顶元素出栈p=adjlist[v].firstedge;while(p){j=p->adjvex;//顶点if(visited[j]==1) p=p->next;else{cout<<adjlist[j].vertex<<" ";visited[j]=1;S[++top]=j;//v进栈p=adjlist[j].firstedge;}}}
}
//求连通分量数,判断图的连通性
void ALGraph::CountComp(ALGraph g)
{int count=0;int n=g.vertexNum;for(int v=0;v<n;v++){if(visited[v]==0){count++;g.DFSL(v);}}if(count==1) cout<<endl<<"改图是连通的!"<<endl;else cout<<endl<<"改图不连通,连通分量数为:"<<count<<endl;
}
int main()
{int a[8]={0,1,2,3,4,5,6,7};ALGraph gr=ALGraph(a,8);//初始化表头gr.createGraph(0,2);gr.createGraph(0,1);gr.createGraph(1,3);gr.createGraph(1,0);gr.createGraph(2,3);gr.createGraph(2,0);gr.createGraph(3,2);gr.createGraph(3,1);gr.createGraph(4,5);gr.createGraph(5,6);gr.createGraph(5,4);gr.createGraph(6,7);gr.createGraph(6,5);gr.createGraph(7,6);gr.displayGraph(8);for(int i=0;i<MaxSize;i++)visited[i]=0;gr.CountComp(gr);return 0;
}

2、有向图的连通性

求有向图的强连通分量,可以使用十字链表存储,利用深度优先非递归搜索遍历。

(1)在有向图G上,按出弧表深度优先非递归搜索遍历有向图G。

从某顶点v出发,沿以v为弧尾的弧进行深度优先非递归遍历,并对深度优先非递归搜索遍历算法修改,使被访问过的顶点(下标)入栈,按顶点(下标)退桟的次序将顶点顺序记录在另一个数组outstack[MaxSize]。若依次不能遍历完图中所有顶点,再任取下一个未被访问过的顶点出发遍历,重复上述,直到图中所有顶点被访问完。outstack设计为全局数组,全部顶点都记录在其中,其中顶点顺序和深度优先遍历顺序相反。

(2)统计连通分量数的计数器count置1。按入弧表对图进行深度优先非递归搜索遍历。取outstack最后的顶点,从该顶点出发,沿着以该顶点为弧头的弧做逆向(按入弧表)深度优先非递归比遍历。若此次不能遍历完图中顶点,则从余下的顶点中最后完成搜索遍历的顶点出发,即outstack中由后往前的未被访问顶点继续做逆向深度优先非递归遍历,直至有向图中所有顶点都被逆向深度优先遍历。每一次做逆向遍历,count增1。每一次逆向遍历所访问到的顶点就是一个强连通分量的顶点集,count是强连通分量数。

图的连通性和连通分量相关推荐

  1. 图的连通性和连通分量_英语,人口,连通性和露营地

    图的连通性和连通分量 by Evaristo Caraballo 通过Evaristo Caraballo 英语,人口,连通性和露营地 (English, Population, Connectivi ...

  2. Victoria的舞会2——图的连通性及连通分量

    Victoria的舞会2 Description Victoria是一位颇有成就的艺术家,他因油画作品<我爱北京天安门>闻名于世界.现在,他为了报答帮助他的同行们,准备开一个舞会.  Vi ...

  3. 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1...

    import java.util.ArrayList; import java.util.List; // 模块E public class AdjMatrixGraph<E> { pro ...

  4. 图的连通性 —— 连通性的相关知识

    图的连通性 -- 连通性的相关知识 [无向图的连通分量] 在无向图中,如果从节点vi 到节点vj 有路径,则称节点vi 和节点vj 是连通的.如果图中任意两个节点都是连通的,则称图G 为连通图.如下图 ...

  5. matlab 连通分支,(完整版)图的连通性判断matlab实验报告

    实验三:图的连通性判断 一.实验目的 用计算机语言编写图的连通性判断算法,可输入图的邻接矩阵,判断图是否连通以及确定连通分支的个数,掌握Warshell 算法或矩阵幂算法的实现方法. 二.实验原理 1 ...

  6. 利用矩阵的n次方求图的连通性

    设A(n x n)为一个图的邻接矩阵,则a(i,j)表示两个点之间是否连通(1:连通,0:不连通).那么A的k次方中的每一个a(i,j)表示点i和j之间长度为k的路的条数.假设一个图能划分成若干个子图 ...

  7. poj 3310(并查集判环,图的连通性,树上最长直径路径标记)

    题目链接:http://poj.org/problem?id=3310 思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径 ...

  8. 电子科技大学《图论及其应用》复习总结--第三章 图的连通性

    第三章 图的连通性 一.割边.割点和块 (一).割边及其性质 定义1 边e为图G的一条割边,如果 w(G−e)>w(G)w(G-e)>w(G)w(G−e)>w(G) 定理1 边 e ...

  9. 专题讲座4 图的连通性和Tarjan算法 学习心得

    题目都好抽象,但又有点套路 题目地址: ZJNU-2022暑期专题-图的连通性和tarjan - Virtual Judge (vjudge.net) 目录 概念: 板子例题: 强连通分量 拓扑排序 ...

最新文章

  1. 人脸识别 python调用face++ 功能测试
  2. python读取csv文件制图-python读取CSV文件
  3. Linux虚拟机或阿里云部署本地Javaweb项目
  4. Java 面试题 —— 老田的蚂蚁金服面试经历
  5. Convolution(2021牛客暑期多校训练营4)
  6. ubuntu vim保存退出命令_【学员分享】程序员效率神器,最常用VIM插件安装大全...
  7. 最近公共祖先LCA 【专题@AbandonZHANG】
  8. 回顾Vue计算属性VS其他语法有感
  9. 使用malloc分别分配2KB的空间,然后用realloc调整为6KB的内存空间,打印指针地址...
  10. abaqus与python后处理_abaqus用Python批量后处理教程!如何从abaqus导出python
  11. (三十一)树莓派3B+获取ADS1115 ADC转换的数据
  12. SCOI2018滚粗记
  13. 【从零开始学深度学习编译器】十五,MLIR Toy Tutorials学习笔记之Lowering到LLVM IR
  14. 【Vue】ElementUI、ECharts使用 cdn引入
  15. 戴尔服务器的性能,解析戴尔12G服务器主要性能提升和改进
  16. Lambda使用指北(上)
  17. 转载:汶川大地震中业余无线电应急通讯发挥作用
  18. 通过云端自动生成openmv的神经网络模型,进行目标检测
  19. 详解吉首大学第九届“新星杯”G芒砀山的神秘数字 两种dp
  20. 浏览器如何显示页面(二)

热门文章

  1. f下行到什么形成全音_乐理试题二
  2. Python每日一练(5)-百词斩
  3. 黑马程序员 java基础复习二 之面向对象
  4. “性冷淡”的企业聊天工具,里面的秘密比陌陌还多
  5. 使用京东云免费云主机搭建CentOS
  6. 电脑打不开浏览器--解决方法
  7. CSS 网页背景图片设置
  8. Redis 一篇足以
  9. 运维服务流程设计文档
  10. 微信小程序中简单使用echarts图表