文档库 最新最全的文档下载
当前位置:文档库 › 7.4.1无向图的连通分量和生成树

7.4.1无向图的连通分量和生成树

7.4.1无向图的连通分量和生成树
7.4.1无向图的连通分量和生成树

7.4.1无向图的连通分量和生成树。

void DFSForest(Graph G,CSTree &T)

//建立无向图G的深度优先生成森林的

//(最左)孩子(右)兄弟链表T。

{

T=NULL;

for(v=0;v

visited[v]=FALSE;

for(v=0;v

{

if(!visited[v]) //第v顶点为新的生成树的根节点。

{

p=(CSTree)malloc(sizeof(CSNode)); //分配根节点。

*p={GetVex(G,v),NULL,NULL}; //给该节点赋值。

if(!T) T=p; //是第一棵生成树的根(T的根)。

else q->nextSibling=p; //是其他生成树的根(前一棵的根的“兄弟”)。

q=p; //q指示当前生成树的根。

DFSTree(G,v,p); //建立以p为根的生成树。

}// if(!visited[v])

}// for(v=0;v

}// DFSForest

Void DFSTree(Graph G,int v,CSTree &T)

//从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。

{

visited[v]=TRUE;first=TRUE;

for(w=FirstAdjVex(G,v);w;w=NextAdjVex(G,v,w))

{

if(!visited[w])

{

p=(CSTree)malloc(sizeof(CSNode)); //分配孩子节点。

*p={GetVex(G,w),NULL,NULL};

if(first) //w是v的第一个未被访问的邻接顶点

{ //是根的左孩子节点。

T->lchild=p;first=FALSE;

}// if(first)

else //w是v的其它未被访问的邻接顶点

{ //是上一邻接顶点的右兄弟节点。

q->nextsibling=p;

}// else

q=p;

DFSTree(G,w,q); //从第w个顶点出发深度优先遍历图G,建立子生成树q。 }// if(!visited[w])

}// for(w=FirstAdjVex(G,v);

}// DFSTree

7.4.2有向图的强连通分量。asdfasdfdfasd

无向图的深度优先生成树

用邻接表存储的无向图的深度优先生成树,树结点用孩子兄弟结构保存。下面是代码view plain 1.#include 2.#include https://www.wendangku.net/doc/2f7066921.html,ing namespace std; 4. 5.#define MAX_VERTEX_NUM 20 6.bool visited[20];//用于遍历时辅助使用 7.bool searched[20];//用于建树时辅助使用 8. 9.//循环队列模版 10.template 11.class My_queue; 12. 13.template 14.class Node 15.{ 16.private: 17. T data; 18. Node *next; 19.public: 20. Node() 21. { 22. next=0; 23. } 24. Node(T d) 25. { 26. data=d; 27. next=0; 28. } 29.friend My_queue; 30.}; 31. 32.template 33.class My_queue 34.{ 35.private: 36. Node *tail; 37.public: 38. My_queue() 39. { 40. tail=new Node();

41. tail->next=tail; 42. } 43. 44.bool empty() 45. { 46.return (tail->next==tail); 47. } 48. 49.void push(T d) 50. { 51. Node *p=new Node(d); 52. p->next=tail->next; 53. tail->next=p; 54. tail=p; 55. } 56. 57. T front() 58. { 59.if(empty()) 60. { 61. cout<<"queue is empty!"< *p=tail->next; 65. T data=p->next->data; 66.return data; 67. } 68. 69.void pop() 70. { 71. Node *p=tail->next; 72. Node *q=p->next; 73. p->next=q->next; 74.if(q==tail) 75. tail=p; 76.delete q; 77. } 78.}; 79. 80.class ALGraph; 81.class CS_Tree; 82.//树结点 83.class CSnode 84.{

数据结构课程设计图的遍历和生成树求解

数学与计算机学院 课程设计说明书 课程名称: 数据结构与算法课程设计 课程代码: 6014389 题目: 图的遍历和生成树求解实现 年级/专业/班: 学生姓名: 学号: 开始时间: 2012 年 12 月 09 日 完成时间: 2012 年 12 月 26 日 课程设计成绩: 指导教师签名:年月日

目录 摘要 (3) 引言 (4) 1 需求分析 (5) 1.1任务与分析 (5) 1.2测试数据 (5) 2 概要设计 (5) 2.1 ADT描述 (5) 2.2程序模块结构 (7) 软件结构设计: (7) 2.3各功能模块 (7) 3 详细设计 (8) 3.1结构体定义 (19) 3.2 初始化 (22) 3.3 插入操作(四号黑体) (22) 4 调试分析 (22) 5 用户使用说明 (23) 6 测试结果 (24) 结论 (26)

摘要 《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的: ?了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; ?初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; ?提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 这次课程设计我们主要是应用以前学习的数据结构与面向对象程序设计知识,结合起来才完成了这个程序。 因为图是一种较线形表和树更为复杂的数据结构。在线形表中,数据元素之间仅有线性关系,每个元素只有一个直接前驱和一个直接后继,并且在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,本程序是采用邻接矩阵、邻接表、十字链表等多种结构存储来实现对图的存储。采用邻接矩阵即为数组表示法,邻接表和十字链表都是图的一种链式存储结构。对图的遍历分别采用了广度优先遍历和深度优先遍历。 关键词:计算机;图;算法。

图的连通性总结

图的连通性总结 boboo 目录 1.图的遍历及应用 1.1.DFS遍历 1.2.DFS树的边分类 1.3.DFS树的性质 1.4.拓补排序 1.5.欧拉回路 2.无向图相关 2.1求割顶 2.2求图的桥 2.3求图的块 3.有向图相关 3.1求强连通分量(SCC划分) 3.2求传递闭包 4.最小环问题

一、图的遍历及应用 1.1 DFS遍历 DFS是求割顶、桥、强连通分量等问题的基础。 DFS对图进行染色, 白色:未访问; 灰色:访问中(正在访问它的后代); 黑色:访问完毕 一般在具体实现时不必对图的顶点进行染色,只需进行访问开始时间和访问结束时间的记录即可,这样就可以得出需要的信息了。 -发现时间D[v]:变灰的时间 -结束时间f[v]:变黑的时间 -1<=d[v]

数据结构图习题分解

第7章图 一、单项选择题 1.在一个无向图G中,所有顶点的度数之和等于所有边数之和的______倍。 A.l/2 B.1 C.2 D.4 2.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的______倍。 A.l/2 B.1 C.2 D.4 3.一个具有n个顶点的无向图最多包含______条边。 A.n B.n+1 C.n-1 D.n(n-1)/2 4.一个具有n个顶点的无向完全图包含______条边。 A.n(n-l) B.n(n+l) C.n(n-l)/2 D.n(n-l)/2 5.一个具有n个顶点的有向完全图包含______条边。 A.n(n-1) B.n(n+l) C.n(n-l)/2 D.n(n+l)/2 6.对于具有n个顶点的图,若采用邻接矩阵表示,则该矩阵的大小为______。 A.n B.n×n C.n-1 D.(n-l) ×(n-l) 7.无向图的邻接矩阵是一个______。 A.对称矩阵B.零矩阵

C.上三角矩阵D.对角矩阵 8.对于一个具有n个顶点和e条边的无(有)向图,若采用邻接表表示,则表头向量的大小为______。 A.n B.e C.2n D.2e 9.对于一个具有n个顶点和e条边的无(有)向图,若采用邻接表表示,则所有顶点邻接表中的结点总数为______。 A.n B.e C.2n D.2e 10.在有向图的邻接表中,每个顶点邻接表链接着该顶点所有______邻接点。 A.入边B.出边 C.入边和出边D.不是入边也不是出边 11.在有向图的逆邻接表中,每个顶点邻接表链接着该顶点所有______邻接点。 A.入边B.出边 C.入边和出边D.不是人边也不是出边 12.如果从无向图的任一顶点出发进行一次深度优先搜索即可访问所有顶点,则该图一定是______。 A.完全图B.连通图 C.有回路D.一棵树 13.采用邻接表存储的图的深度优先遍历算法类似于二叉树的______算法。 A.先序遍历B.中序遍历 C.后序遍历 D.按层遍历

7.4.1无向图的连通分量和生成树

7.4.1无向图的连通分量和生成树。

void DFSForest(Graph G,CSTree &T) //建立无向图G的深度优先生成森林的 //(最左)孩子(右)兄弟链表T。 { T=NULL; for(v=0;vnextSibling=p; //是其他生成树的根(前一棵的根的“兄弟”)。 q=p; //q指示当前生成树的根。 DFSTree(G,v,p); //建立以p为根的生成树。 }// if(!visited[v]) }// for(v=0;vlchild=p;first=FALSE; }// if(first) else //w是v的其它未被访问的邻接顶点 { //是上一邻接顶点的右兄弟节点。 q->nextsibling=p; }// else q=p; DFSTree(G,w,q); //从第w个顶点出发深度优先遍历图G,建立子生成树q。 }// if(!visited[w]) }// for(w=FirstAdjVex(G,v); }// DFSTree

求一个无向图G的连通分量的个数

《数据结构》实验报告 实验内容:(一)判断一个图有无回路 (二)求一个无向图G的连通分量的个数 一、目的和要求(需求分析): 1、了解图的定义和图的存储结构。 2、熟悉掌握图的邻接矩阵和邻接表。 3、理解图的遍历算法---深度优先搜索和广度优先搜索。 4、学会编程处理图的连通性问题。 二、程序设计的基本思想,原理和算法描述: (包括程序的结构,数据结构,输入/输出设计,符号名说明等) 判断一个图有无回路: 在程序设计中,先必须确定所要创建的图是有向还是无向,是图还是网,其次再根据各自的特点,用连接表来实现创建。 在有向图中,先找出入度为0的顶点,删除与这个顶点相关联的边(出边),将与这些边相关的其它顶点的入度减1,循环直到没有入度为0的顶点。如果此时还有未被删除的顶点,则必然存在环路,否则不存在回路。 无向图则可以转化为: 如果存在回路,则必然存在一个子图,是一个回路。因此回路中所有定点的度>=2。 第一步:删除所有度<=1的顶点及相关边,并将另外与这些边相关的其它顶点的度减1。 第二步:将度数变为1的顶点排入队列,并从该队列中(使用栈)取出一个顶点,并重复步骤一。 如果最后还有未删除的顶点,则存在回路,否则没有。 求一个无向图G的连通分量的个数: 用连接表创建图,对于非连通图,则需从多个顶点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。所以在设计中,为了统计出无向图中的连通分量个数,则因在其深度优先所搜无向图时对函数DFSTraverse(ALGraph G)调用DFS次数进行统计,其结果便为无向图中连通分量个数。 三、调试和运行程序过程中产生的问题及采取的措施: 在调试和运行求一个无向图G的连通分量的个数程序时,由于执行语句块 void DFSTraverse(ALGraph G)先于void DFS(ALGraph G,int v), 而void DFSTraverse(ALGraph G)内调用了DFS( ),因此计算机无法正确运行,将两者顺序进行了交换,程序便实现了其功能,且运行正常。 四、源程序及注释:

数据结构编程——求无向图连通子图

#include #include void DFS(int **a,int v,int *k,int n,int *visit){ int *S=(int *)malloc(50*sizeof(int)); int top=-1,j; (*k)++; visit[v]=1; ++top; S[top]=v; while(top!=-1){ v=S[top]; for(j=1;j<=n;j++){ if(a[v][j]==1&&visit[j]==0){ (*k)++; visit[j]=1; S[++top]=j; break; } if(j==n)top--; } } } void xxxx(){ int n,m,i;//n个顶点,m条边 scanf("%d %d",&n,&m);

int *visit=(int *)malloc((n+1)*sizeof(int)); int **a=(int **)malloc((n+1)*sizeof(int*)); int e,f; for(e=0;e<=n;e++){ a[e]=(int *)malloc(sizeof(int)*(n+1)); } for(e=1;e<=n;e++) for(f=1;f<=n;f++) a[e][f]=0; for(e=1;e<=n;e++) visit[e]=0; for(i=1;i<=m;i++){ scanf("%d %d",&e,&f); a[e][f]=1; a[f][e]=1; } int k=0; int sum=0; int *b=(int *)malloc((n+1)*sizeof(int)); DFS(a,1,&k,n,visit); sum++; b[0]=k; e=1; int v; for(v=1;v<=n;v++){ k=0; if(visit[v]==0){ DFS(a,v,&k,n,visit); sum++; b[e]=k; e++; } } printf("%d\n",sum); int t; for(i=0;i

有向图的强连通分量算法

有向图的强连通分量 分类:C/C++程序设计2009-04-15 16:50 2341人阅读评论(1) 收藏举报最关键通用部分:强连通分量一定是图的深搜树的一个子树。 一、Kosaraju算法 1.算法思路 基本思路: 这个算法可以说是最容易理解,最通用的算法,其比较关键的部分是同时应用了原图G和反图G T。(步骤1)先用对原图G进行深搜形成森林(树),(步骤2)然后任选一棵树对其进行深搜(注意这次深搜节点A能往子节点B走的要求是E AB存在于反图G T),能遍历到的顶点就是一个强连通分量。余下部分和 原来的森林一起组成一个新的森林,继续步骤2直到没有顶点为止。7 改进思路: 当然,基本思路实现起来是比较麻烦的(因为步骤2每次对一棵树进行深搜时,可能深搜到其他树上去,这是不允许的,强连通分量只能存在单棵树中(由开篇第一句话可知)),我们当然不这么做,我们可以巧妙的选择第二深搜选择的树的顺序,使其不可能深搜到其他树上去。想象一下,如果步骤2是从森林里选择树,那么哪个树是不连通(对于G T来说)到其他树上的

呢?就是最后遍历出来的树,它的根节点在步骤1的遍历中离开时间最晚,而且可知它也是该树中离开时间最晚的那个节点。这给我们提供了很好的选择,在第一次深搜遍历时,记录时间i离开的顶点j,即numb[i]=j。那么,我们每次只需找到没有找过的顶点中具有最晚离开时间的顶点直接深搜(对于G T来说)就可以了。每次深搜都得到一个强连通分量。 隐藏性质: 分析到这里,我们已经知道怎么求强连通分量了。但是,大家有没有注意到我们在第二次深搜选择树的顺序有一个特点呢?如果在看上述思路的时候,你的脑子在思考,相信你已经知道了!!!它就是:如果我们把求出来的每个强连通分量收缩成一个点,并且用求出每个强连通分量的顺序来标记收缩后的节点,那么这个顺序其实就是强连通分量收缩成点后形成的有向无环图的拓扑序列。为什么呢?首先,应该明确搜索后的图一定是有向无环图呢?废话,如果还有环,那么环上的顶点对应的所有原来图上的顶点构成一个强连通分量,而不是构成环上那么多点对应的独自的强连通分量了。然后就是为什么是拓扑序列,我们在改进分析的时候,不是先选的树不会连通到其他树上(对于反图GT来说),也就是后选的树没有连通到先选的树,也即先出现的强连通分量收缩的点只能指向后出现的强连通分量收缩的点。那么拓扑序列不是理所当然的吗?这就是Kosaraju算法的一个隐藏性质。

数据结构 第六章 图 练习题及答案详细解析(精华版)

图 1. 填空题 ⑴ 设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。 【解答】0,n(n-1)/2,0,n(n-1) 【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。 ⑵ 任何连通图的连通分量只有一个,即是()。 【解答】其自身 ⑶ 图的存储结构主要有两种,分别是()和()。 【解答】邻接矩阵,邻接表 【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。 ⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。 【解答】O(n+e) 【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。 ⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。 【解答】求第j列的所有元素之和 ⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。 【解答】出度

⑺ 图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。 【解答】前序,栈,层序,队列 ⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。 【解答】O(n2),O(elog2e) 【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。 ⑼ 如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。 【解答】回路 ⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。 【解答】vi, vj, vk 【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。 2. 选择题 ⑴ 在一个无向图中,所有顶点的度数之和等于所有边数的()倍。 A 1/2 B 1 C 2 D 4 【解答】C 【分析】设无向图中含有n个顶点e条边,则。

有向图的强连通分量

实验报告 课程名称数据结构 实验项目名称有向图的强连通分量 班级与班级代码14计算机实验班 实验室名称(或课室)实验楼803 专业计算机科学与技术 任课教师 学号: 姓名: 实验日期:2015年12 月03 日 广东财经大学教务处制

姓名实验报告成绩 评语: 指导教师(签名) 年月日说明:指导教师评分后,实验报告交院(系)办公室保存。

一、实验目的与要求 采用邻接表存储的有向图。 二、实验内容 (1)创建N个节点的空图 DiGraph CreateGraph(int NumVertex)//创建一个N个节点的空图 { DiGraph G; G = malloc( sizeof( struct Graph ) ); if( G == NULL ) FatalError( "Out of space!!!" ); G->Table = malloc( sizeof( struct TableEntry ) * NumVertex ); if( G->Table == NULL ) FatalError( "Out of space!!!" ); G->NumVertex = NumVertex; G->NumEdge = 0; int i; for (i=0;iTable[i].Header=MakeEmpty(NULL); G->Table[i].V=i; } return G; } (2)在图G上执行DFS,通过对DFS生成森林的后序遍历对G的顶点编号。 //后序DFS遍历图G,并将节点按后序遍历的顺序编号 int *PostDFS(DiGraph G) { int NumVertex=G->NumVertex; int visited[NumVertex]; int i;

1一个连通的无向图G

1.一个连通的无向图G,如果它的所有结点的度数都是偶数,那么它具有一条( ) A.汉密尔顿回路 B.欧拉回路 C.汉密尔顿通路 D.初级回路 2.设G是连通简单平面图,G中有11个顶点5个面,则G中的边是( ) A.10 B.12 C.16 D.14 3.在布尔代数L中,表达式(a∧b)∨(a∧b∧c)∨(b∧c)的等价式是( ) A.b∧(a∨c) B.(a∧b)∨(a’∧b) C.(a∨b)∧(a∨b∨c)∧(b∨c) D.(b∨c)∧(a∨c) 4.设i是虚数,·是复数乘法运算,则G=<{1,-1,i,-i},·>是群,下列是G的子群是( ) A.<{1},·> B.〈{-1},·〉 C.〈{i},·〉 D.〈{-i},·〉 5.设Z为整数集,A为集合,A的幂集为P(A),+、-、/为数的加、减、除运算,∩为集合的交 运算,下列系统中是代数系统的有( ) A.〈Z,+,/〉 B.〈Z,/〉 C.〈Z,-,/〉 D.〈P(A),∩〉 6.下列各代数系统中不含有零元素的是( ) A.〈Q,*〉Q是全体有理数集,*是数的乘法运算 B.〈Mn(R),*〉,Mn(R)是全体n阶实矩阵集合,*是矩阵乘法运算 C.〈Z, 〉,Z是整数集, 定义为x xy=xy, ?x,y∈Z D.〈Z,+〉,Z是整数集,+是数的加法运算 7.设A={1,2,3},A上二元关系R的关系图如下: R具有的性质是 A.自反性 B.对称性 C.传递性 D.反自反性 8.设A={a,b,c},A上二元关系R={〈a,a〉,〈b,b〉,〈a,c〉},则关系R的对称闭包S(R)是( ) A.R∪I A B.R C.R∪{〈c,a〉} D.R∩I A 9.设X={a,b,c},Ix是X上恒等关系,要使Ix∪{〈a,b〉,〈b,c〉,〈c,a〉,〈b,a〉}∪R为X上的 等价关系,R应取( ) A.{〈c,a〉,〈a,c〉} B.{〈c,b〉,〈b,a〉} C.{〈c,a〉,〈b,a〉} D.{〈a,c〉,〈c,b〉} 10.下列式子正确的是( ) A. ?∈? B.??? C.{?}?? D.{?}∈? 11.设解释R如下:论域D为实数集,a=0,f(x,y)=x-y,A(x,y):x

求无向连通图的生成树

求无向连通图的生成树

————————————————————————————————作者:————————————————————————————————日期:

求无向连通图的生成树 一、实验目的 ⑴掌握图的逻辑结构 ⑵掌握图的邻接矩阵存储结构 ⑶验证图的邻接矩阵存储及其遍历操作的实现 二、实验内容 (1)建立无向图的邻接矩阵存储 (2)对建立的无向图,进行深度优先遍历 (3)对建立的无向图进行广度优先遍历 三、设计与编码 (1)本实验用到的理论知识 (2)算法设计 (3)编码 // 图抽象类型及其实现.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include"Graph.h" #include"iostream.h" int Graph::Find(int key,int &k) { ?int flag=0; ?for(int i=0;i<VertexLen;i++) ?if(A[i].data.key==key){k=i;flag=1;break;}; return flag; }; int Graph::CreateGraph(int vertexnum,Edge *E,int edgenum) {//由边的集合E(E[0]~E[VertexNum-1]),生成该图的邻接表

表示 if(vertexnum<1)return(-1);//参数vertexnum非法int i,front,rear,k; ?Enode *q; ?//先生成不带边表的顶点表--即顶点为孤立顶点集 ?A=newVnode[vertexnum]; if(!A)return(0);//堆耗尽 ?for(i=0;ikey=front; q->Weight=E[i].weight; ??q->next=A[rear].first; ?A[rear].first=q; ?A[rear].data.OutDegree++; A[front].data.InDegree++; ?if(Type>2) { ??q=new Enode;

数据结构 无向图的存储和遍历

《数据结构》实验报告 ◎实验题目:无向图的存储和遍历 ◎实验目的:1、掌握使用Visual C++6.0上机调试程序的基本方法; 2、掌握图的邻接表存储结构和深度优先遍历的非递归算法。 3、提高自己分析问题和解决问题的能力,在实践中理解教材上的理论。 ◎实验内容:建立有10个顶点的无向图的邻接表存储结构,然后对其进行深度优先遍历,该无向图可以是无向连通图或无向非连通图。 一、需求分析 1、输入的形式和输入值的范围:根据提示,首先输入图的所有边建立邻接表存储结构,然后输入遍历的起始顶点对图或非连通图的某一连通分量进行遍历。 2、输出的形式:输出对该图是连通图或非连通图的判断结果,若是非连通图则输出各连通分量的顶点,之后输出队连通图或非连通图的某一连通分量的遍历结果。 3、程序所能达到的功能:输入图的所有边后,建立图的邻接表存储结构,判断该图是连通图或非连通图,最后对图进行遍历。 4、测试数据: 输入10个顶点(空格分隔):A B C D E F G H I J 输入边的信息(格式为x y):AB AC AF CE BD DC HG GI IJ HJ EH 该图为连通图,请输入遍历的起始顶点:A 遍历结果为:A F C D B E H J I G 是否继续?(是,输入1;否,输入0):1 输入10个顶点(空格分隔):A B C D E F G H I J 输入边的信息(格式为xy):AB AC CE CA AF HG HJ IJ IG 该图为非连通图,各连通分量中的顶点为: < A F C E B > < D > < G I J H > 输入第1个连通分量起始顶点:F 第1个连通分量的遍历结果为:F A C E B 输入第2个连通分量起始顶点:I 第2个连通分量的遍历结果为:I G H J 输入第3个连通分量起始顶点:D 第3个连通分量的遍历结果为:D 是否继续?(是,输入1;否,输入0):0 谢谢使用! Press any key to continue 二概要设计 1、邻接表是图的一种顺序存储与链式存储结构结合的存储方法。邻接表表示法类似于树的孩子链表表示法。就是对图G中的每个顶点Vi,将所有邻接于Vi的顶点Vj链成一个单链表,这个单链表就称为顶点Vi的邻接表,再将所有邻接表的表头放到数组中,就构成了图的邻接表,邻接表表示中的两种结点结构如下所示。

求无向连通图的生成树

求无向连通图得生成树 一、实验目得 ⑴掌握图得逻辑结构 ⑵掌握图得邻接矩阵存储结构 ⑶验证图得邻接矩阵存储及其遍历操作得实现 二、实验内容 (1)建立无向图得邻接矩阵存储 (2)对建立得无向图,进行深度优先遍历 (3)对建立得无向图进行广度优先遍历 三、设计与编码 (1)本实验用到得理论知识 (2)算法设计 (3)编码 // 图抽象类型及其实现、cpp : Defines the entry point for the console application、 // #include”stdafx。h” #include”Graph.h" #include”iostream。h” intGraph::Find(int key,int&k) { int flag=0; for(inti=0;i〈VertexLen;i++) ?if(A[i]、data。key==key){k=i;flag=1;break;}; ?return flag; }; int Graph::CreateGraph(int vertexnum,Edge *E,int edge num) {?//由边得集合E(E[0]~E[VertexNum—1]),生成该图得邻接表表示?if(vertexnum<1)return(—1);//参数vertexnum非法 ?int i,front,rear,k;

Enode *q; //先生成不带边表得顶点表-—即顶点为孤立顶点集 A=new Vnode[vertexnum]; ?if(!A)return(0);//堆耗尽 for(i=0;i〈vertexnum;i++) { ?A[i]、data、key=i; ?A[i]、tag=0; ??A[i]、data.InDegree=A[i]、data。OutDegree=A[i]、tag=0; ?A[i]、first=0; }; VertexLen=vertexnum; //在生成边表 ?if(edgenum〈0)return(1);//无边得图 for(i=0;i<edgenum;i++) { ? front=E[i]。Head;rear=E[i]。Tail; ?if(!Find(rear,k) ||!Find(front,k))return(-2);//参数E非法 ?q=new Enode; ?if(!q)return(0); ??q->key=front; q->Weight=E[i]、weight; ? q—>next=A[rear]。first; A[rear]、first=q; A[rear]、data.OutDegree++; ? A[front]、data。InDegree++; if(Type>2) ?{ ?q=new Enode; if(!q)return(0); ??q—〉key=rear; ???q-〉next=A[front]、first; ??A[front]。first=q;

图的遍历和生成树求解实现的课程结构设计

图的遍历和生成树求解实现的课程结构设计 一.问题描述: 1.图的遍历和生成树求解实现 图是一种较线性表和树更为复杂的数据结构。在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(及其孩子结点)相关但只能和上一层中一个元素(即双亲结点)相关;而在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。 生成树求解主要利用普利姆和克雷斯特算法求解最小生成树,只有强连通图才有生成树。 2.基本功能 1) 先任意创建一个图; 2) 图的DFS,BFS的递归和非递归算法的实现 3) 最小生成树(两个算法)的实现,求连通分量的实现 4) 要求用邻接矩阵、邻接表等多种结构存储实现 3.输入输出 输入数据类型为整型和字符型,输出为整型和字符 二、概要设计 1.设计思路: a.图的邻接矩阵存储:根据所建无向图的结点数n,建立n*n的矩阵,其中元素全是无穷大(int_max),再将边的信息存到数组中。其中无权图的边用1表示,无边用0表示;有全图的边为权值表示,无边用∞表示。 b.图的邻接表存储:将信息通过邻接矩阵转换到邻接表中,即将邻接矩阵的每一行都转成链表的形式将有边的结点进行存储。 c.图的广度优先遍历:假设从图中的某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后再访问此邻接点的未被访问的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中还有未被访问的,则另选未被访问的重复以上步骤,是一个非递归过程。 d.图的深度优先遍历:假设从图中某顶点v出发,依依次访问v的邻接顶点,然后再继续访问这个邻接点的系一个邻接点,如此重复,直至所有的点都被访问,这是个递归的过程。 e.图的连通分量:这是对一个非强连通图的遍历,从多个结点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其连通分量的顶点集。本程序利用的图的深度优先遍历算法。

求无向连通图的生成树

求无向连通图的生成树 一、实验目的 ⑴掌握图的逻辑结构 ⑵掌握图的邻接矩阵存储结构 ⑶验证图的邻接矩阵存储及其遍历操作的实现 二、实验内容 (1)建立无向图的邻接矩阵存储 (2)对建立的无向图,进行深度优先遍历 (3)对建立的无向图进行广度优先遍历 三、设计与编码 (1)本实验用到的理论知识 (2)算法设计 (3)编码 // 图抽象类型及其实现.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include"Graph.h" #include"iostream.h" int Graph::Find(int key,int &k) { int flag=0; for(int i=0;i

if(vertexnum<1)return(-1);//参数vertexnum非法 int i,front,rear,k; Enode *q; //先生成不带边表的顶点表--即顶点为孤立顶点集 A=new Vnode[vertexnum]; if(!A)return(0);//堆耗尽 for(i=0;ikey=front; q->Weight=E[i].weight; q->next=A[rear].first; A[rear].first=q; A[rear].data.OutDegree++; A[front].data.InDegree++; if(Type>2) { q=new Enode; if(!q)return(0); q->key=rear; q->next=A[front].first;

图的遍历生成树

实验项目:图的先深、先广遍历生成树 实验目的: 1、学会把图转化为程序能识别的邻接矩阵 2、透彻理解图的两种遍历方法及对应的生成树。 涉及的知识点:图的表示法、生成树的概念、图的深度优先、广度优先遍历算法 实验内容: 该程序是对树进行先深、先广遍历,请在此基础上,改为处理指定图,求该图从指定结点出发的先深、先广遍历生成树。 // AdjMWGraph.h : Defines the entry point for the console application. #include "SeqList.h" #include "SeqQueue.h" const int MaxVertices=10; const int Max Weight=10000; //表示无穷大 class AdjMWGraph { private: SeqList Vertices; // 顶点信息的线性表 int Edge[MaxVertices][MaxVertices]; //边的权信息矩阵 int numOf E dges; //当前的边数 public: AdjMWGraph(const int sz=MaxVertices);//构造函数,参数是顶点数目 int GraphEmpty()const { return Vertices.ListEmpty(); } int NumOfVertices(void)//当前结点个数 { return Vertices.ListSize(); } int NumOf E dges(void)//边数 { return numOf E dges; } VerT GetValue(const int i); //取结点i的值 int GetWeight(const int v1, const int v2); //取弧的权重; //插入顶点vertex void InsertVertex(const VerT &vertex); //插入弧,权为w eight void InsertE dge(const int v1,const int v2,int w eight); //删除与顶点i及关联的边 void DeleteVertex(const int i); //删除弧 void DeleteEdge(const int v1,const int v2); //取顶点i的第一条邻接边,返回邻接点的下标,否则返回-1 int GetFirstNeighbor(const int v);

实现有向图强连通分量的算法 数据结构课程设计报告

课程设计报告 课程设计名称:数据结构课程设计 课程设计题目:实现求有向图强连通分量的算法 院(系): 专业: 班级: 学号: 姓名: 指导教师:

沈阳航空航天大学课程设计报告 目录 1 系统分析 (1) 1.1题目介绍 (1) 1.2功能要求 (1) 2 概要设计 (2) 2.1流程图 (2) 2.2结构体说明 (2) 3 详细设计 (3) 3.1遍历函数设计 (3) 3.1.1 Kosaraju算法基本思路: (3) 3.1.2伪代码 (4) 3.2调试分析和测试结果 (6) 3.2.1调试分析 (6) 3.2.2测试结果 (6) 参考文献 (8) 附录(关键部分程序清单) (9)

沈阳航空航天大学课程设计报告 1 系统分析 1.1 题目介绍 在键盘上输入有向图,对任意给定的图(顶点数和边数自定),建立它的邻接表并输出。然后判断该图是否强连通。如果是强连通图,求出该图的所有强连通分量并输出字符。 1.2 功能要求 首先输入图的类型,有向图(因为遍历与权值无关,所以没有涉及带权图)。然后输入图的顶点数、边数和各条边,之后生成该图的邻接表并输出。 再输入要遍历该图的起点,然后从所输入的点深度搜索该图的十字链表,并按遍历顺序输出顶点内容。之后决定是否继续遍历该图或输入另一个需要遍历的图亦或是结束程序。 要求采取简单方便的输入方式。并且系统要求提供观察有向图图形结构和各强连通分量结构的功能。

2 概要设计 2.1 流程图 根据程序要求,设计流程图如下: 图2.1——流程图 2.2 结构体说明 //有向图十字链表存储表示 typedef struct arcbox int tailvex,headvex;//该弧的尾和头顶点的位置

相关文档
相关文档 最新文档