图的存储结构及实现(邻接表(包含拓扑排序))

[数据结构] 图的邻接表拓扑排序实现 #include #include #include #define Max_V 100 // 最大顶点数 using namespace std; typedef struct node { int vtex; //邻接点 int weight; //权值 struct node *next; //链域 } EdgeNode; 阅读详情

#include

using namespace std;
template
struct EdgeNode
{
int adjvex;
EdgeNode *next;
};
template
struct VertexNode
{
int in;
DataType vertex;
EdgeNode *firstEdge;
};
const int MaxSize=10;
int visited[MaxSize]={0};
template
class ALGraph
{
public:
ALGraph(DataType a[],int n,int e);//构造函数,建立n个顶点e条边的图
~ALGraph();//析构函数,释放邻接表各边表结点的存储空间
void DFTraverse(int v);//深度优先遍历图
void BFTraverse(int v);//广度优先遍历图
void TopSort();//拓扑排序图
private:
VertexNode adjlist[MaxSize];//存放顶点的数组
int vertexNum,edgeNum;//图的顶点数和边数
};
template
ALGraph::ALGraph(DataType a[],int n,int e)
{
int i,j,k;
EdgeNode *s=nullptr;
vertexNum=n;
edgeNum=e;
for(i=0;i<vertexNum;i++)//输入顶点信息,初始化顶点表
{
adjlist[i].vertex=a[i];
adjlist[i].firstEdge=nullptr;
}
for(k=0;k<edgeNum;k++)//依次输入每一条边
{
cout<<“输入边所依附的两个顶点的编号:”;
cin>>i>>j;//输入边所依附的两个顶点的编号
s=new EdgeNode;s->adjvex=j;//生成一个边表结点s
s->next=adjlist[i].firstEdge;//将结点s插入到第i个边表的表头
adjlist[i].firstEdge=s;
}
for(i=0;i<vertexNum;i++){
cout<<“请依次输入每个结点的入度:”;//简单起见,输入每个顶点的入度
cin>>adjlist[i].in;
}
}
template
ALGraph::~ALGraph()
{
EdgeNode *p=nullptr,*q=nullptr;
for(int i=0;i<vertexNum;i++)
{
p=q=adjlist[i].firstEdge;
while(p!=nullptr)
{
p=p->next;
delete q;
q=p;
}
}
}
template
void ALGraph::DFTraverse(int v)
{
int j;
EdgeNode *p=nullptr;
cout<<adjlist[v].vertex;
visited[v]=1;
p=adjlist[v].firstEdge;//工作指针p指向顶点v的边表结点
while(p!=nullptr)//依次搜索顶点v的邻接点j
{
j=p->adjvex;
if(visited[j]0)
DFTraverse(j);
p=p->next;
}
}
template
void ALGraph::BFTraverse(int v)
{
int w,j,Q[MaxSize];//采用顺序队列
int front=-1,rear=-1;//初始化队列
EdgeNode *p=nullptr;
cout<<adjlist[v].vertex;
visited[v]=1;
Q[++rear]=v;//被访问顶点入队
while(front!=rear)//当队列非空时
{
w=Q[++front];
p=adjlist[w].firstEdge;//工作指针p指向顶点v的边表
while(p!=nullptr)
{
j=p->adjvex;
if(visited[j]0)
{
cout<<adjlist[j].vertex;
visited[j]=1;
Q[++rear]=j;
}
p=p->next;
}
}
}
template
void ALGraph::TopSort()
{
int i,j,k,count=0;//累加器count初始化
int S[MaxSize],top=-1;//采用顺序栈并初始化
EdgeNode *p=nullptr;
for(i=0;i<vertexNum;i++)//扫描顶点表
{
if(adjlist[i].in
0)//将入度为0的顶点压栈
S[++top]=i;
}
while(top!=-1)//当栈中还有入度为0的顶点时
{
j=S[top–];//从栈中取出入度为0的顶点
cout<<adjlist[j].vertex;
count++;
p=adjlist[j].firstEdge;//工作指针p初始化
while(p!=nullptr)//扫描顶点表,找出顶点j的所有出边
{
k=p->adjvex;
adjlist[k].in–;
if(adjlist[k].in
0)//将入度为0的顶点入栈
S[++top]=k;
p=p->next;
}
}
if(count<vertexNum)
cout<<“有回路”;
}
int main()
{
char ch[]= {‘a’,‘b’,‘c’,‘d’,‘e’};
ALGraph m{ch,5,6};//建立具有5个顶点6条边的有向图
for (int i=0; i<MaxSize; i++) {
visited[i]=0;
}
cout<<“深度优先遍历序列为:”<<endl;
m.DFTraverse (0); //从顶点0出发进行深度优先遍历
cout<<endl;
for (int i=0; i<MaxSize; i++) {
visited[i]=0;
}
cout<<“广度优先遍历序列为:”<<endl;
m.BFTraverse (0); //从结点0出发进行广度优先遍历
cout<<endl;
cout<<“拓扑排序序列为:”<<endl;
m.TopSort();//拓扑排序
return 0;
}

C语言利用图的邻接矩阵的存储方式实现拓扑排序  C语言利用图的邻接矩阵的存储方式实现拓扑排序 在拓扑排序中,我们的对象是有向无环图,这种图是描述工程进行过程的有效工具。比如“课程开课顺序,施工进程,软件开发进程”,我们在使用有向无环图表示他们的时候,我们往往使用顶点表示这些事件中的一个活动,顶点和顶点之间的有向边表示一种活动和活动之间的先后顺序。 如上就是一种有向无环图,比如在活动c1进行完成之后,c8、c3才可以开始进行。通常,我们... 阅读详情

相关推荐

使用邻接表进行拓扑排序的算法说明

讲拓扑排序的概念,先来回顾一个大家熟悉的东西:技能树(图)! 因为这个特好理解,玩过暗黑或其他RPG游戏的都应该见过类似的技能树,一句话,就是学习高级技能前需要先学习之前的低级技能。 一个技能树其实是一个简单的图,你可以把它再变化一下就是一张图,即让一些高级技能间也发生联系,使得学习一种高级技能可以通过多种途径,于是这就是一个正儿八经的图了。 拓扑排序就是要排出这样一个线性序列,即“高等技

爱学习的草莓熊 1万+

C语言-《数据结构》基于邻接表实现有向图的拓扑排序算法,以栈的方式实现拓扑排序

本文为学生自学用,主要基于朱昌杰 肖建于编著的《数据结构》

qq_71375720的博客 1188

图的邻接表表示及拓扑排序

图的定义 图(graph)G=(V,&amp;nbsp;E)G=(V,&amp;nbsp;E)G=(V,\ E),由顶点(vertex)集VVV和边(edge)集EEE组成。每条边为一个点对(v,&amp;nbsp;w)(v,&amp;nbsp;w)(v,\ w)。 图的表示 ① 邻接矩阵表示法:使用一个二维数组A,对每条边(u, v), A[u][v]=1;否则为0。总空间大小为O(|v|2)O(|v|2)O(|v...

SanFancsgo的博客 2889

【算法导论】邻接表存储的拓扑排序

上一篇文章中讲述了用邻接矩阵存储的图的拓扑排序,下面本文介绍用邻接表存储的图的拓扑排序。 关于拓扑排序的概念及基本思想,我在上一篇文章中已经较为详细的描述了,这里不在介绍。我们知道利用邻接矩阵进行拓扑排序时,程序实现较为简单,但是效率不高,算法的复杂度为O(n^3).而利用邻接表会使入度为0的顶点的操作简化,从而提高算法的效率。 在邻接表存储结构中,为了便于检查每个顶点的入度,可在顶点表中增加

青峰碧陋室 9475

图邻接表C语言实现 拓扑排序

ALGpraph.h#pragma once /************************************************************************/ /* 图的邻接表存储结构 */ /************************************************************************/ #define

4497

《数据结构与算法分析》图论算法--邻接表与拓扑排序

前言:       上一周一直在忙着准备阿里巴巴的笔试,花了大量时间复习以前的内容,不过感觉好像没有起到什么作用,现在不想这些问题了,先专心学习数据结构。现在终于来到了本科时遇到最头疼的图论了。本科时就只会在纸上画一画算法,现在我要亲手实现它们。 我的github: 我实现的代码全部贴在我的github中,欢迎大家去参观。 https://github.com/YinWen

yw8355507的专栏 1597

数据结构实验3:图的应用

目的要求 1.掌握图的存储策略及其存储实现。 2.掌握图的深度、广度优先遍历的算法策略及其程序实现。 3.掌握图的常见算法策略及其程序实现。 实验内容 1.键入或随机生成数据,建立一个有向图的邻接表。 2.输出该邻接表。 3.以有向图邻接表为基础上,计算各顶点的度并输出。 4.以有向图邻接表为基础,输出其拓扑排序序列。 5.采用邻接表存储,实现无向图的非递归 DFS 遍历。 6.采用邻接表存储,实现无向图的 BFS 优先遍历。 7.判断无向图任意两个顶点间是否有路径,若有则输出路径上的顶点序列。 8.在主函

qtL0ng的博客 1954

GMSL Strapping Pins CFG0/CFG1 应用

如果 0x13.bit3 = 0, 则是链路没有 Locked,需要去排查下具体问题(通常是工作模式配置问题)如果遇到 Link 无法建立(Locked),电源没有问题的情况下,多半是加串器和解串器的工作模式不匹配。芯片在上电时,会检测这两个管脚的电压,根据不同的电压值,芯片进入到不同的工作模式。一对加串器和解串器,只要工作模式匹配得当,Link Locked,便能够正常工作。ADI 已经充分考虑了用户的需求,尽可能的降低的芯片的使用和配置复杂度。GMSL 的解串器也是类似的配置,具体请参考对应的规格书。

iStoneWalker的博客 1271

邻接表实现有向图BFS、DFS、拓扑排序

图的大家族 常用图的存储结构有两种:邻接矩阵,邻接表。一个数组,一个链表,可见复杂的数据结构是建立在基础结构之上的,在这里选择邻接表存储,边比较少时省空间。 图按照有无方向,有无权重,分为四类 无向无权:无向图 无向有权:无向网 有向无权:有向图 有向有权:有向网 可见带有权重称为网,否则称为图。 图可以看成边权均为1,所以是特殊网。因此掌握了网,也就顺带会了图 由于无向图均有对称性,所以大...

努力做个书呆儿 5479

mstar PQ软件修改方法

1.修改ADC的值 Static code APIXC_AdcGainOffsetSetting tADCSetting[ADC_SET_NUMS]= #define INIT_ADC_RGB_RED_GAIN               0x1000 #define INIT_ADC_RGB_GREEN_GAIN           0x1000 #define INIT_ADC_RGB

qq_18810259的专栏 2565

计算机视觉——多视图几何

多视图几何1.前言1.1 多视图几何概念2. 基本原理2.1 对极几何2.2 基础矩阵2.2.1 基础矩阵推导2.2.2 求解基础矩阵3. 实验过程3.1 实验数据准备3.2 实验代码3.3 实验结果及分析4. 实验中遇到的问题 1.前言 1.1 多视图几何概念 多视图几何是利用在不同视点所拍摄图像间的关系,来研究照相机之间或者特征之间关系的一门科学。 多视图几何(Multiple View ...

RuiMa的博客 7715

拓扑排序详解(包含算法原理图解、算法实现过程详解、算法例题变式全面讲解等)

非常详细的讲解。点开有惊喜!

aliyonghang的博客 2万+

Tesseract-Ocr踩坑下载以及进行检验

1 OCR,即Optical Character Recognition:光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。下载完成后进行解压找到这两个,然后复制到之前下载Tesseract-Ocr的tessdata文件下。可能会出现报错说chi下载的问题咱们不用管继续ok让它先下载完毕,后续会有下载chi的步骤。四、检验tesseract使用(将以下图片进行下载我这里将以下图片命名为3.png)我这里选的是2024年的版本如果下载不了;4 在安装的时候(找到下载的exe文件,双击)

m0_51428325的博客 1916

邻接表拓扑排序算法【C/C++】

邻接表的拓扑排序算法。

bblb的博客 4553

408计算机复试专业课问答汇总

408计算机复试专业课问答汇总

weixin_45930223的博客 3699

使用自己的数据跑通mmsegmentation

使用自己的数据跑通mmsegmentation,解决以下报错:1)type object 'FileClient' has no attribute 'infer_client' 2)It is expected output_size equals to 2, but got size 3 3)训练测试结果报NAN 4)KeyError: 'MyDataset is not in the dataset registry' 5)预训练模型和加载的网络结构层名有差异,unexpected key .....

猫猫与橙子的博客 1657

数据结构C++——拓扑排序

数据结构C++——拓扑排序 文章目录数据结构C++——拓扑排序一、前言二、拓扑排序的概念及作用三、拓扑排序的实现①拓扑排序的实现原理②拓扑排序中FindInDegree()函数的实现③拓扑排序的代码实现④完整测试代码四、总结 一、前言 拓扑排序需要用到栈和邻接表的相关知识,由于笔者在之前的文章中已经介绍过栈和邻接表,此处不再过多赘述,对此部分还不太了解的读者欢迎移步此文章,共同学习!: 数据结构C++——栈 数据结构C++——图的邻接矩阵和邻接表. 二、拓扑排序的概念及作用 (1)有向无环图:一个无环的有向

qq_54162207的博客 2万+

OpenCV-Python实战(11)——OpenCV轮廓检测相关应用

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,我们将学习如何利用获取到的轮廓,进行形状分析以及对象检测和识别。

盼小辉丶的博客 1万+

建立邻接表并实现拓扑排序

邻接表的拓扑排序 本拓扑排序建立在之前博客建立邻接表的基础上进行排序,在之前建立邻接表的基础上在表头(表的第一列存点的信息)的基础上增加indegree变量用来表示每个点的度。拓扑排序主要思路: (1)统计所有顶点的入度,接着把入度为0的全部入栈或者入队列(我用的是队列)。(2)取出栈顶元素,或者队列的首个元素,标记该顶点为"已访问"状态。(3)接着删除该顶点与其它顶点的联系,即把其它相邻顶点的入...

weixin_43956284的博客 1141

Keras深度学习实战(32)——基于LSTM预测股价

股价预测是时间序列预测中最具挑战性的问题之一,研究股价预测问题具有重要的理论意义和应用价值。针对循环神经网络在股价预测中存在的长期依赖等缺点,本文引入了长短时记忆神经网络以提高股价预测的效果。同时,我们把有关公司的新闻标题的文本数据作为模型的输入变量时,发现预测效果更好,因此我们可以把有关公司的新闻标题的文本数据作为一个有效的输入变量。最后,通过利用 Keras 实现了以上两个股价预测模型,并进行了性能分析和对比。

盼小辉丶的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

邻接表:BFS实现拓扑排序

邻接表:BFS实现拓扑排序作者: 冯向阳时间限制: 1S章节: DS:图截止日期: 2022-06-30 23:55:00问题描述 :目的:使用C++模板设计并逐步完善图的邻接表抽象数据类型(ADT)。内容:(1)请参照图的邻接矩阵模板类原型,设计并逐步完善图的邻接表ADT。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。)(2)设计并实现一个算法,基于广度优先搜索的思想,对于给定的有向图(网),实现拓扑排序。...

nameofworld的博客 636

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

拓扑排序-邻接表实现(C语言)

/*拓扑排序*/ #include<stdio.h> #include<stdlib.h> #define max 105 typedef struct edge{ int adjvex; int weight; struct edge* next; }Elink; typedef struct ver{ int vertex; Elink* link; }Vlink; Vlink Graph[max]; 以上为邻接表常规操作 int temp[max][max];

qq_47319674的博客 1285

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

拓扑排序_基于邻接表

//拓扑排序_基于邻接表 //大纲:删除无前继结点的顶点 // //输入: // 先确定顶点数和边数 // 分为头结点和值结点,头结点含有count,用于计数这个结点当前含有的前继 // //输出拓扑排序: // 使用栈记录count为0的结点,栈空时结束 // 当count--后为0,说明这个结点的前继处理完了,把这个结点放入栈里 // 最后若还有值结点存在,说明存在环了 // /

紫云的博客 3345

邻接表和邻接矩阵实现拓扑排序

先贴代码, 先贴简要的解释,周末更新. 邻接表的实现 #ifndef __ADJ_GRAPH__ #define __ADJ_GRAPH__ #include <iostream> #include <vector> struct ArchNode { int adj_vertex; ArchNode* next; }; struct VertexNode { int vertex_id; ArchNode* first; ArchNode* tail;

葡萄老君 1811

拓扑排序-用栈实现(附带邻接表图的存储结构定义)

#define MaxVertexNum 100//最大顶点数目 typedef struct ArcNode{//边表结点 int adjvex; struct ArcNode *next; InfoType info;//权值 }ArcNode; typedef struct VNode{//顶点表结点 VertexType data; ArcNode *first;//指向第一条依附该顶点的弧 }VNode,AdjList[MaxVertexNum]; typedef struct{ A.

vener_的博客 998

33 邻接表:BFS实现拓扑排序

33 邻接表:BFS实现拓扑排序作者: 冯向阳时间限制: 1S章节: DS:图截止日期: 2022-06-30 23:55:00问题描述 :目的:使用C++模板设计并逐步完善图的邻接表抽象数据类型(ADT)。内容:(1)请参照图的邻接矩阵模板类原型,设计并逐步完善图的邻接表ADT。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。)(2)设计并实现一个算法,基于广度优先搜索的思想,对于给定的有向图(网),实现拓扑排序。如排

Ultravioletrays的博客 523
上一篇: 图的存储结构及实现(邻接矩阵)
下一篇: 顺序查找
Never__Forget
博客等级 码龄6年 1粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值