C++邻接矩阵表示无向图
《数据结构》第八章习题参考答案 (1)

有向图的任意顶点的度=邻接表中顶点所对应边链表中结点个数+逆邻接表中顶点所对应边链表中结点个数;
4、课本P3928.3题
【解答】
n个顶点的无向连通图至少有n-1条边,n个பைடு நூலகம்点的无向强连通图至少有n(n-1)/2条边;n个顶点的有向连通图至少有n条边,n个顶点的有向强连通图至少有n(n-1)条边。
上面不正确的是(A)。
A.(1),(2),(3) B.(1) C.(1),(3) D.(2),(3)
5、下列说法不正确的是(C)。
A.图的遍历是从给定的源点出发每一个顶点仅被访问一次
B.遍历的基本算法有两种:深度遍历和广度遍历
C.图的深度遍历不适用于有向图
D.图的深度遍历是一个递归过程
三、填空题
1、判断一个无向图是一棵树的条件是_有n个顶点,n-1条边的无向连通图_。
注: 答案并不唯一
2、课本P3928.1题
【解答】
(1)不是强连通图
(2)简单路径如:D->B->C->F
(3)略
(4)邻接表见图,其他略
3、课本P3928.2题
【解答】
(1)邻接矩阵表示:无向图的边数为
矩阵中非零元素的个数/2;有向图的边数为矩阵中非零元素的个数。
邻接表表示时:无向图的边数为邻接表中边结点的个数/2;有向图的边数为邻接表中边结点的个数。
(2)(3)略
12、课本P3958.24题
【解答】
A->B : 10
A->B->D: 15
A->B->D->C : 17
A->B->D->E : 17
数据结构选择、判断、填空

北京语言大学网络教育学院《数据结构》一、【单项选择题】1、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则采用(C)存储方式最节省时间。
[C] 带头结点的双循环链表2、队列操作的原则是(D)。
[D] 先进先出3、某二叉树的先序序列和后序序列正好相反,则该二叉树一定是(B)的二叉树。
[B] 高度等于其结点数4、在下列排序方法中,(C)方法平均时间复杂度为0(nlogn),最坏情况下时间复杂度为0(n2)。
[C] 快速排序5、对二叉树从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一个结点的左、右孩子中,其左孩子编号小于右孩子编号。
则可采用(C)次序的遍历实现编号。
[C] 后序6、若线性表中采用二分查找法查找元素,该线性表应该(C)。
[C] 元素按值有序,且采用顺序存储结构。
7、对待排序数据的初始状态不作任何要求的排序方法有(A)。
[A] 插入和快速排序8、已知数据表A中每个元素距其最终位置不远,则采用(B)排序算法最节省时间。
[B] 插入排序9、以下哪一个不是队列的基本运算?(B)[B] 从队列中删除第i个元素。
10、广度优先遍历类似于二叉树的(D)。
[D] 层次遍历一、【单项选择题】1、在一个图中,所有顶点的度数之和等于图的边数的(C)倍。
[C] 22、采用顺序查找方法查找长度为n的线性表,平均查找长度为(C)。
[C] (n+1)/23、线性链表不具有的特点是(A)。
[A] 随机访问4、删除长度为n的非空顺序表的第i个数据元素之前需要移动表中(A)个数据元素。
[A] n-i5、任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序(A)。
[A] 不发生改变6、若用数组S[n]作为两个栈S1和S2的共用存储结构,对任何一个栈,只有当S[n]全满时才不能作入栈操作。
为这两个栈分配空间的最佳方案是(C)。
[C] S1的栈底位置为0,S2的栈底位置为n-17、对一棵二叉排序树进行(C)遍历,可以得到该二叉树的所有结点按值从小到大排列的序列。
图基本算法图的表示方法邻接矩阵邻接表

图基本算法图的表⽰⽅法邻接矩阵邻接表 要表⽰⼀个图G=(V,E),有两种标准的表⽰⽅法,即邻接表和邻接矩阵。
这两种表⽰法既可⽤于有向图,也可⽤于⽆向图。
通常采⽤邻接表表⽰法,因为⽤这种⽅法表⽰稀疏图(图中边数远⼩于点个数)⽐较紧凑。
但当遇到稠密图(|E|接近于|V|^2)或必须很快判别两个给定顶点⼿否存在连接边时,通常采⽤邻接矩阵表⽰法,例如求最短路径算法中,就采⽤邻接矩阵表⽰。
图G=<V,E>的邻接表表⽰是由⼀个包含|V|个列表的数组Adj所组成,其中每个列表对应于V中的⼀个顶点。
对于每⼀个u∈V,邻接表Adj[u]包含所有满⾜条件(u,v)∈E的顶点v。
亦即,Adj[u]包含图G中所有和顶点u相邻的顶点。
每个邻接表中的顶点⼀般以任意顺序存储。
如果G是⼀个有向图,则所有邻接表的长度之和为|E|,这是因为⼀条形如(u,v)的边是通过让v出现在Adj[u]中来表⽰的。
如果G是⼀个⽆向图,则所有邻接表的长度之和为2|E|,因为如果(u,v)是⼀条⽆向边,那么u会出现在v的邻接表中,反之亦然。
邻接表需要的存储空间为O(V+E)。
邻接表稍作变动,即可⽤来表⽰加权图,即每条边都有着相应权值的图,权值通常由加权函数w:E→R给出。
例如,设G=<V,E>是⼀个加权函数为w的加权图。
对每⼀条边(u,v)∈E,权值w(u,v)和顶点v⼀起存储在u的邻接表中。
邻接表C++实现:1 #include <iostream>2 #include <cstdio>3using namespace std;45#define maxn 100 //最⼤顶点个数6int n, m; //顶点数,边数78struct arcnode //边结点9 {10int vertex; //与表头结点相邻的顶点编号11int weight = 0; //连接两顶点的边的权值12 arcnode * next; //指向下⼀相邻接点13 arcnode() {}14 arcnode(int v,int w):vertex(v),weight(w),next(NULL) {}15 arcnode(int v):vertex(v),next(NULL) {}16 };1718struct vernode //顶点结点,为每⼀条邻接表的表头结点19 {20int vex; //当前定点编号21 arcnode * firarc; //与该顶点相连的第⼀个顶点组成的边22 }Ver[maxn];2324void Init() //建⽴图的邻接表需要先初始化,建⽴顶点结点25 {26for(int i = 1; i <= n; i++)27 {28 Ver[i].vex = i;29 Ver[i].firarc = NULL;30 }31 }3233void Insert(int a, int b, int w) //尾插法,插⼊以a为起点,b为终点,权为w的边,效率不如头插,但是可以去重边34 {35 arcnode * q = new arcnode(b, w);36if(Ver[a].firarc == NULL)37 Ver[a].firarc = q;38else39 {40 arcnode * p = Ver[a].firarc;41if(p->vertex == b) //如果不要去重边,去掉这⼀段42 {43if(p->weight < w)44 p->weight = w;45return ;46 }47while(p->next != NULL)48 {49if(p->next->vertex == b) //如果不要去重边,去掉这⼀段50 {51if(p->next->weight < w);52 p->next->weight = w;53return ;54 }55 p = p->next;56 }57 p->next = q;58 }59 }60void Insert2(int a, int b, int w) //头插法,效率更⾼,但不能去重边61 {62 arcnode * q = new arcnode(b, w);63if(Ver[a].firarc == NULL)64 Ver[a].firarc = q;65else66 {67 arcnode * p = Ver[a].firarc;68 q->next = p;69 Ver[a].firarc = q;70 }71 }7273void Insert(int a, int b) //尾插法,插⼊以a为起点,b为终点,⽆权的边,效率不如头插,但是可以去重边74 {75 arcnode * q = new arcnode(b);76if(Ver[a].firarc == NULL)77 Ver[a].firarc = q;78else79 {80 arcnode * p = Ver[a].firarc;81if(p->vertex == b) return; //去重边,如果不要去重边,去掉这⼀句82while(p->next != NULL)83 {84if(p->next->vertex == b) //去重边,如果不要去重边,去掉这⼀句85return;86 p = p->next;87 }88 p->next = q;89 }90 }91void Insert2(int a, int b) //头插法,效率跟⾼,但不能去重边92 {93 arcnode * q = new arcnode(b);94if(Ver[a].firarc == NULL)95 Ver[a].firarc = q;96else97 {98 arcnode * p = Ver[a].firarc;99 q->next = p;100 Ver[a].firarc = q;101 }102 }103void Delete(int a, int b) //删除以a为起点,b为终点的边104 {105 arcnode * p = Ver[a].firarc;106if(p->vertex == b)107 {108 Ver[a].firarc = p->next;109 delete p;110return ;111 }112while(p->next != NULL)113if(p->next->vertex == b)114 {115 p->next = p->next->next;116 delete p->next;117return ;118 }119 }120121void Show() //打印图的邻接表(有权值)122 {123for(int i = 1; i <= n; i++)124 {125 cout << Ver[i].vex;126 arcnode * p = Ver[i].firarc;127while(p != NULL)128 {129 cout << "->(" << p->vertex << "," << p->weight << ")";130 p = p->next;131 }132 cout << "->NULL" << endl;133 }134 }135136void Show2() //打印图的邻接表(⽆权值)137 {138for(int i = 1; i <= n; i++)140 cout << Ver[i].vex;141 arcnode * p = Ver[i].firarc;142while(p != NULL)143 {144 cout << "->" << p->vertex;145 p = p->next;146 }147 cout << "->NULL" << endl;148 }149 }150int main()151 {152int a, b, w;153 cout << "Enter n and m:";154 cin >> n >> m;155 Init();156while(m--)157 {158 cin >> a >> b >> w; //输⼊起点、终点159 Insert(a, b, w); //插⼊操作160 Insert(b, a, w); //如果是⽆向图还需要反向插⼊161 }162 Show();163return0;164 }View Code 邻接表表⽰法也有潜在的不⾜之处,即如果要确定图中边(u,v)是否存在,只能在顶点u邻接表Adj[u]中搜索v,除此之外没有其他更快的办法。
带权无向图

带权无向图(用邻接矩阵表示)#include <>#include<>#define int_max 10000#define inf 9999#define max 20dj=int_max;[i][j].info=NULL;}printf("输入一条边依附的顶点和权:\n");for(int k=0;k!=;++k){scanf("%c%c%d",&v1,&v2,&w); dj=w;[j][i].adj=w;}return ;}typedef struct ArcNode ata=[i];[i].firstarc=NULL;}for(i=0;i!=;++i){for(j=0;j!=;++j){if[i].firstarc==NULL){if[i][j].adj!=int_max&&j!={arc=(ArcNode *)malloc(sizeof(ArcNode));arc->adjvex=j;[i].firstarc=arc;arc->nextarc=NULL;p=arc;++j;while[i][j].adj!=int_max&&j!={tem=(ArcNode *)malloc(sizeof(ArcNode));tem->adjvex=j;[i].firstarc=tem;tem->nextarc=arc;arc=tem;++j;}--j;}}else{if[i][j].adj!=int_max&&j!={arc=(ArcNode *)malloc(sizeof(ArcNode));arc->adjvex=j;p->nextarc=arc;arc->nextarc=NULL;p=arc;}}}}=;=;printf("图G的邻接表创建成功!\n"); return 1;}typedef struct{int adjvex;int lowcost;}closedge;int prim(int g[][max],int n) \n");printf("1、使用prim算法求最小生成树……………\n"); printf("2、退出系统…………………………………\n\n"); }void main(){ALGraph G1;MGraph_L G;int i,d,g[20][20];char y='y';int k;while(y=='y'){list();printf("请选择菜单:\n");scanf("%d",&k);switch(k){case 0:d=createMGraph_L(G);CreateUDG(G1,G);break;case 1:for(i=0;i!=;++i)for(int j=0;j!=;++j)g[i+1][j+1]=[i][j].adj;printf("prim:\n");prim(g,d);break;case 2:break;//exit(1);}printf("\n是否继续操作y/n:");scanf("%c",&y);}}。
数据结构 实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
操作系统为 Windows 10。
三、实验内容1、链表的实现与操作创建一个单向链表,并实现插入、删除和遍历节点的功能。
对链表进行排序,如冒泡排序或插入排序。
2、栈和队列的应用用栈实现表达式求值,能够处理加、减、乘、除和括号。
利用队列实现银行排队系统的模拟,包括顾客的到达、服务和离开。
3、二叉树的遍历与操作构建一棵二叉树,并实现前序、中序和后序遍历。
进行二叉树的插入、删除节点操作。
4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先遍历和广度优先遍历。
四、实验步骤及结果1、链表的实现与操作首先,定义了链表节点的结构体:```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```插入节点的函数:```cppvoid insertNode(ListNode& head, int val) {ListNode newNode = new ListNode(val);head = newNode;} else {ListNode curr = head;while (curr>next!= NULL) {curr = curr>next;}curr>next = newNode;}}```删除节点的函数:```cppvoid deleteNode(ListNode& head, int val) {if (head == NULL) {return;}ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;while (curr>next!= NULL && curr>next>data!= val) {curr = curr>next;}if (curr>next!= NULL) {ListNode temp = curr>next;curr>next = curr>next>next;delete temp;}}```遍历链表的函数:```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {std::cout << curr>data <<"";curr = curr>next;}std::cout << std::endl;}```对链表进行冒泡排序的函数:```cppvoid bubbleSortList(ListNode& head) {if (head == NULL || head>next == NULL) {return;}bool swapped;ListNode ptr1;ListNode lptr = NULL;do {swapped = false;ptr1 = head;while (ptr1->next!= lptr) {if (ptr1->data > ptr1->next>data) {int temp = ptr1->data;ptr1->data = ptr1->next>data;ptr1->next>data = temp;swapped = true;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);}```测试结果:创建了一个包含 5、3、8、1、4 的链表,经过排序后,输出为 1 3 4 5 8 。
数据结构第六章图理解练习知识题及答案解析详细解析(精华版)

图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组成的图进行拓扑排序。
数据结构(C语言版)_第7章 图及其应用

实现代码详见教材P208
7.4 图的遍历
图的遍历是对具有图状结构的数据线性化的过程。从图中任 一顶点出发,访问输出图中各个顶点,并且使每个顶点仅被访 问一次,这样得到顶点的一个线性序列,这一过程叫做图的遍 历。
图的遍历是个很重要的算法,图的连通性和拓扑排序等算法 都是以图的遍历算法为基础的。
V1
V1
V2
V3
V2
V3
V4
V4
V5
图9.1(a)
图7-2 图的逻辑结构示意图
7.2.2 图的相关术语
1.有向图与无向图 2.完全图 (1)有向完全图 (2)无向完全图 3.顶点的度 4.路径、路径长度、回路、简单路径 5.子图 6.连通、连通图、连通分量 7.边的权和网 8.生成树
2. while(U≠V) { (u,v)=min(wuv;u∈U,v∈V-U); U=U+{v}; T=T+{(u,v)}; }
3.结束
7.5.1 普里姆(prim)算法
【例7-10】采用Prim方法从顶点v1出发构造图7-11中网所对 应的最小生成树。
构造过程如图7-12所示。
16
V1
V1
V2
7.4.2 广度优先遍历
【例7-9】对于图7-10所示的有向图G4,写出从顶点A出发 进行广度优先遍历的过程。
访问过程如下:首先访问起始顶点A,再访问与A相邻的未被 访问过的顶点E、F,再依次访问与E、F相邻未被访问过的顶 点D、C,最后访问与D相邻的未被访问过的顶点B。由此得到 的搜索序列AEFDCB。此时所有顶点均已访问过, 遍历过程结束。
【例7-1】有向图G1的逻辑结构为:G1=(V1,E1) V1={v1,v2,v3,v4},E1={<v1,v2>,<v2,v3>,<v2,v4>,<v3,v4>,<v4,v1>,<v4,v3>}
Prim算法求无向图的最小生成树

v1=j;
v2=k;
min=G[j][k];
}
if(!in[v2])
{
path[i][0]=v1;
path[i][1]=v2;
in[v1]=1;
in[v2]=1;
min=maxright;
}
}
if(!status)
printf("We cannot deal with it because the graph is not connected!\n");
else
{
for(i=0;i<num-1;i++)
printf("Path %d:vertex %d to vertex %d\n",i+1,path[i][0]+1,path[i][1]+1);
}
return 1;
}
本文来自:中国自学编程网(详细出处参考://7402.html
下面是源代码:
/* Prim.c
Copyright (c) 2002, 2006 by ctu_85
All Rights Reserved.
*/
/* The impact of the situation of articulation point exists can be omitted in Prim algorithm but not in Kruskal algorithm */
restart:
printf("Please enter the number of vertex(s) in the graph:\n");
scanf("%d",&num);
数据结构_练习题 7.3

一.选择题1. 一个有n 个顶点的无向图最多有()条边。
A. nB. n(n-1)C.n(n-1)/2D.2n2. 具有6个顶点的无向图至少应有()条边才能确保是一个连通图。
A .5 B.6 C.7 D.83. 具有n 个顶点且每一对不同的顶点之间都有一条边的图被称为()A.线性图B.无向完全图C.无向图D.简单图 4. 具有4个顶点的无向完全图有()条边。
A.6B.12C.16D.205. G 是一个非连通无向图,共有28条边,则该图至少有()个顶点。
A.6B.7C.8D.9 6. 存储稀疏图的数据结构常用的是()A.链接矩阵B.三元组C.链接表D.十字链表7. 对一个具有n 个顶点的图,采用链接矩阵表示则该矩阵的大小为()A.nB.(n-1)2C.(n+1)2D.n 28. 设连通图G 的顶点数为n ,则G 的生成树的边数为()A.n-1B.nC.2nD.2n-19. N 个顶点的无向图的链接表中结点总数最多有()个。
A.2nB.nC.n/2D.n(n-1) 10. 对于一个具有n 个顶点和e 条边的无向图,若采用链接表表示,则表向量的大小为(),所有顶点链接表的结点总数为()。
A.nB.n+1C.n-1D.2nE.e/2F.e G .2e H.n+e11.从链接矩阵⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=010101010A 可以看出,该图共有()个顶点。
如果是有向图,该图共有()条弧;如果是有向图,则共有()条边。
A.9B.3C.6D.1E.5F.4 G .2 H.0 12. 在有向图的链接表存储结构中,顶点V 在表结点中出现的次数是()A.顶点v 的度B.顶点v 的出度C.顶点v 的入度D.依附于顶点v 的边 13. 在用链接表表示图的情况下,建立图的算法的时间复杂度为()A.O(n+e)B.O(n 2)C.O(n *e)D.O(n 3) 14. 用DFS 遍历一个无环有向图,并在DFS 算法退栈返回时,打印出相应的顶点,则输出的顶点序列是()。
数据结构课程设计报告-最短路径算法-二叉树的三种遍历

数据结构课程设计报告班级:计算机科学与技术132班姓名:赖恒财指导教师:董跃华成绩:32信息工程学院2015 年7月8日目录图的最短路径算法实现1. 需求分析 (1)1.1 程序设计内容 (1)1.2 设计要求 (1)2.概要设计 (2)3.详细设计 (2)3.1 数据类型的定义 (2)3.2 功能模块的设计 (2)3.3 主程序流程 (9)4.调试分析 (10)4.1 问题回顾和分析 (10)4.2.经验和体会 (11)5.测试结果 (12)二叉树的遍历1.设计目的 (13)2.需求分析 (14)2.1课程设计的内容和要求 (14)2.2选题的意义及背景 (14)3.概要设计 (14)3.1设计思想 (14)3.2程序数据类型 (16)3.3程序模块分析 (16)3.3.1置空栈 (16)3.3.2入栈 (17)3.3.3出栈 (17)3.3.4取栈顶操作 (17)3.3.5判空栈 (17)3.4函数关系: (18)4.详细设计 (18)4.1二叉树算法程序截图和结果 (18)5.程序测试结果及问题分析 (19)6.总结 (20)参考文献 (21)附录1 (22)附录2 (26)图的最短路径算法实现----基于floyd最短路径算法1.需求分析设计校园平面图,所含景点不少于8个。
以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。
要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。
1.1程序设计内容1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图;2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍;3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径。
1.2 设计要求(1) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(2) 程序要添加适当的注释,程序的书写要采用缩进格式。
数据结构实验报告-无向图的邻接矩阵存储结构

数学与计算机学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码: 6014389 题目: 无向图的邻接矩阵存储结构年级/专业/班: 2010级软件4班学生姓名: 吴超学号: 312010*********开始时间: 2011 年 12 月 9 日完成时间: 2011 年 12 月 30 日课程设计成绩:指导教师签名:年月日数据结构课程设计任务书学院名称:数学与计算机学院课程代码:__6014389______ 专业:软件工程年级:2010一、设计题目无向图的邻接矩阵存储结构二、主要内容图是无向带权图,对下列各题,要求写一算法实现。
1)能从键盘上输入各条边和边上的权值;2)构造图的邻接矩阵和顶点集。
3)输出图的各顶点和邻接矩阵4)插入一条边5)删除一条边6)求出各顶点的度7)判断该图是否是连通图,若是,返回1;否则返回0.8)使用深度遍历算法,输出遍历序列。
三、具体要求及应提交的材料用C/C++语言编程实现上述内容,对每个问题写出一个算法实现,并按数学与计算机学院对课程设计说明书规范化要求,写出课程设计说明书,并提交下列材料:1)课程设计说明书打印稿一份2)课程设计说明书电子稿一份;3)源程序电子文档一份。
四、主要技术路线提示用一维数组存放图的顶点信息,二维数组存放各边信息。
五、进度安排按教学计划规定,数据结构课程设计为2周,其进度及时间大致分配如下:六、推荐参考资料[1] 严蔚敏,吴伟民.数据结构.清华大学出版社出版。
[2] 严蔚敏,吴伟民. 数据结构题集(C语言版) .清华大学出版社.2003年5月。
[3]唐策善,李龙澎.数据结构(作C语言描述) .高等教育出版社.2001年9月[4] 朱战立.数据结构(C++语言描述)(第二版本).高等出版社出版.2004年4月[5]胡学钢.数据结构(C语言版) .高等教育出版社.2004年8月指导教师签名日期年月日系主任审核日期年月日目录引言 (7)1 需求分析 (7)1.1任务与分析 (7)1.2测试数据 (8)2 概要设计 (8)2.1 ADT描述 (8)2.2程序模块结构 (9)2.3各功能模块 (11)3详细设计 (11)3.1类的定义 (11)3.2 初始化 (12)3.3 图的构建操作 (13)3.4 输出操作 (13)3.5 get操作 (14)3.6 插入操作 (14)3.7 删除操作 (15)3.8 求顶点的度操作 (15)3.10 判断连通操作 (17)3.11 主函数 (17)4 调试分析 (17)4.1 测试数据 (20)4.2调试问题 (20)4.3 算法时间复杂度 (20)4.4 经验和心得体会 (21)5用户使用说明 (21)6测试结果 (21)6.1 创建图 (21)6.2插入节点 (22)6.3 深度优先遍历 (22)6.4 求各顶点的度 (22)6.5 输出图 (23)6.6 判断是否连通 (23)6.7 求边的权值 (24)6.8 插入边 (24)6.9 删除边 (25)结论 (26)致谢 (27)摘要随着计算机的普及,涉及计算机相关的科目也越来越普遍,其中数据结构是计算机专业重要的专业基础课程与核心课程之一,为适应我国计算机科学技术的发展和应用,学好数据结构非常必要,然而要掌握数据结构的知识非常难,所以对“数据结构”的课程设计比不可少。
离散实验——欧拉图的判定和应用

离散实验——欧拉图的判定和应⽤实验六欧拉图判定和应⽤【实验⽬的】掌握判断欧拉图的⽅法。
【实验内容】编程随机⽣成n个结点的⽆向图(有向图)并能进⾏(半)欧拉图的判定,若是则给出所有欧拉路.【要求】对给定n个结点,随机⽣成邻接矩阵以确定某⽆向简单图(有向图)并进⾏欧拉图和半欧拉图的判定,若符合则给出⾄少⼀条欧拉回路或欧拉路。
【实验原理和⽅法】是根据随机⽣成的图求欧拉(回)路,先要随机⽣成⼀个邻接矩阵,然后判定是否是欧拉回路只要根据奇数度结点的个数。
再⽤⼀个递归函数找出欧拉路。
(1)⽤关系矩阵R=表⽰图。
(2)对⽆向图⽽⾔,若所有结点的度都是偶数,则该图为欧拉图。
C语⾔算法:flag=1;for(i=1;i<=n && flag;i++){sum=0;for(j=1;j<=n;j++)if(r[i][j]) sum++;if(sum%2==0) flag=0;}如果 flag 该⽆向图是欧拉图(3)对有向图⽽⾔,若所有结点的⼊度等于出度,则该图为欧拉图。
C语⾔算法:flag=1;for(i=1;i<=n && flag;i++){sum1=0;sum2=0;for(j=1;j<=n;j++)if(r[i][j]) sum1++;for(j=1;j<=n;j++)if(r[j][i]) sum2++;if(sum1%2==0 || sum2%2==0) flag=0;}如果 flag 该有向图是欧拉图(4)求出欧拉路的⽅法:欧拉路经过每条边⼀次且仅⼀次。
可⽤回溯的⽅法求得所有欧拉路。
C语⾔算法:intcount=0,cur=0,r[N][N]; // r[N][N]为图的邻接矩阵,cur为当前结点编号,count为欧拉路的数量。
int sequence[M];// sequence保留访问点的序列,M为图的边数输⼊图信息;void try1(int k) //k表⽰边的序号{int i,pre=cur; //j保留前⼀个点的位置,pre为前⼀结点的编号if (r[cur][i]) //当前第cur点到第i点连通{//删除当前点与第i点的边,记下第k次到达点i,把第i个点设为当前点 r[cur][i]=0;cur=sequence[k]=i;if (k<M) try1(k+1); //试下⼀个点else prt1();//经过了所有边,打印⼀个解//上⾯条件不满⾜,说明当前点的出度为0,回溯,试下⼀位置r[pre][i]=1;cur=pre;}}附上代码:有向图:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>int n,a[100][100],m=0,visit[100];int cur=0,s[100],vis[100][100];void try1(int k)//取欧拉路{int i;if(cur==m+1){for(i=0;i<cur;i++){if(i==0)printf("%d",s[i]+1);elseprintf("->%d",s[i]+1);}printf("\n");}else{for(i=0;i<n;i++){if(a[k][i]&&!vis[k][i]){vis[k][i]=1;vis[i][k]=1;s[cur++]=i;try1(i);cur--;vis[k][i]=0;vis[i][k]=0;}}}}void dfs(int k){int i;visit[k]=1;for(i=0;i<n;i++){if(a[k][i]&&!visit[i]){dfs(i);}}}int fun()//判断连通性{int i;dfs(0);return0;}return1;}int main(void){int i,j;memset(vis,0,sizeof(vis));memset(visit,0,sizeof(visit));srand(time(NULL));printf("请输⼊节点个数n:");scanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<n;j++){if(i==j)a[i][j]=0;else if(i>j)a[i][j]=a[j][i];elsea[i][j]=rand()%2;m+=a[i][j];}}m/=2;printf("邻接矩阵为:\n ");for(i=0;i<n;i++){printf(" %d",i+1);}printf("\n");for(i=0;i<n;i++){printf("%d",i+1);for(j=0;j<n;j++)printf(" %d",a[i][j]);printf("\n");}if(fun()==0){printf("该图不是连通图!\n");return0;}printf("该图是连通图!\n");int odd=0;for(i=0;i<n;i++){int sum=0;for(j=0;j<n;j++){if(a[i][j])sum++;}if(sum%2)odd++;}if(odd==0){printf("该图没有奇数度节点,具有欧拉回路,是欧拉图。
算法设计与分析(第2版) 王红梅 胡明 习题参考答案

usingnamespacestd;
intmain()
{
longdoubleresult=1;
doublej=1;
for(inti=1;i<=64;++i)
{
j=j*2;
result+=j;
j++;
}
cout<<result<<endl;
return0;
}
习题3
1.假设在文本"ababcabccabccacbab"中查找模式"abccac",写出分别采用BF算法和KMP算法的串匹配过
else
value=a[i+2]-a[i+1];
}
cout<<value<<endl;
return0;
}
4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。要求分别给出伪代码和C++描述。
#include<iostream>
usingnamespacestd;
{
if(n==1)
return4;
elseif(n>1)
return3*T(n-1);
}
(2)
intT(intn)
{
if(n==1)
return1;
elseif(n>1)
return2*T(n/3)+n;
}
5.求下列问题的平凡下界,并指出其下界是否紧密。
(1)求数组中的最大元素;
(2)判断邻接矩阵表示的无向图是不是完全图;
数据结构(C语言版)选择`填空题

数据结构(C语言版)选择、填空题一概论选择1、( )是数据的基本单位。
A、数据结构B、数据元素C、数据项D、数据类型2、以下说法不正确的是( )。
A、数据结构就是数据之间的逻辑结构。
B、数据类型可看成是程序设计语言中已实现的数据结构。
C、数据项是组成数据元素的最小标识单位。
D、数据的抽象运算不依赖具体的存储结构。
3、学习数据结构主要目的是( )。
A、处理数值计算问题B、研究程序设计技巧C、选取合适数据结构,写出更有效的算法。
D、是计算机硬件课程的基础。
4、一般而言,最适合描述算法的语言是( )。
A、自然语言B、计算机程序语言C、介于自然语言和程序设计语言之间的伪语言D、数学公式5、通常所说的时间复杂度指( )。
A、语句的频度和B、算法的时间消耗C、渐近时间复杂度D、最坏时间复杂度6、A算法的时间复杂度为O(n^3),B算法的时间复杂度为O(2^n),则说明( )。
A、对于任何数据量,A算法的时间开销都比B算法小B、随着问题规模n的增大,A算法比B算法有效C、随着问题规模n的增大,B算法比A算法有效D、对于任何数据量,B算法的时间开销都比A算法小填空1、数据的( )结构依赖于计算机语言.2、数据的逻辑结构可分为线性结构和( )结构。
3、算法的时间复杂度与问题的规模有关外,还与输入实例的( )有关。
4、常用的四种存储方法是什么?5、常见的数据的逻辑结构有哪两种?6、一般,将算法求解问题的输入量称为( )。
二线性表选择题1、以下关于线性表的说法不正确的是( )。
A、线性表中的数据元素可以是数字、字符、记录等不同类型。
B、线性表中包含的数据元素个数不是任意的。
C、线性表中的每个结点都有且只有一个直接前趋和直接后继。
D、存在这样的线性表:表中各结点都没有直接前趋和直接后继。
2、线性表的顺序存储结构是一种( )的存储结构。
A、随机存取B、顺序存取C、索引存取D、散列存取3、在顺序表中,只要知道( ),就可在相同时间内求出任一结点的存储地址。
c++ 建图

[ read(i,j,w) {读入边<i,j>和权}G.arcs[i][j]:=w]
G.arcs[i][j]=G.arcs[i][i]{置对称弧}
end;
该算法的执行时间是O(n+n2+e),其中消耗在邻接矩阵初始化操作上的时间是O(n2),而e<n2,所以上述算法的时间复杂度是O(n2)。
{//邻接矩阵表示法的各个数据结构
VrType adj;// 顶点关系类型。对无权图,用或表示相邻否;对带权图,则为权值类型。
InfoType *info;// 该弧相关信息的指针
} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
一、设计题目:图的建立及输出
*问题描述:
建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。
二、算法设计的思想
1、邻接矩阵表示法:
设G=(V,E)是一个图,其中V={V1,V2,V3…,Vn}。G的邻接矩阵是一个他有下述性质的n阶方阵:
1,若(Vi,Vj)∈E 或<Vi,Vj>∈E;
A[i,j]={
1,反之
图5-2中有向图G1和无向图G2的邻接矩阵分别为 M1和 M2:
M1=┌ 0 1 0 1 ┐
│ 1 0 1 0 │
│ 1 0 0 1 │
└ 0 0 0 0 ┘
M2=┌ 0 1 1 1 ┐
│ 1 0 1 0 │
│ 1 1 0 1 │
intelem1[MAX_VERTEX_NUM];
无向图邻接矩阵

无向图邻接矩阵
无向图邻接矩阵能够用来表示无向图中节点间的相互关系。
无向图是一种用来表示非简单环路网络的图形抽象结构。
它是一个无序的由边连接的节点组成的集合,其中节点是图的数学对象,边则表示节点之间的关系。
对于节点的描述和空间位置没有明确的规定,可以用来描述任何网络结构。
无向图用邻接矩阵表示,这种方法又叫作矩阵表示法,是一种典型的表示图结构的常用方法。
无向图邻接矩阵是一个方阵,其行列数等于图中节点数,主对角线上的元素均为0,非对角线上的元素均非0,表示节点间是否有边。
无向图邻接矩阵在图的存储和处理中被广泛使用,他的优点在于可以直观的表示无向图的关系,这可以有效降低存储和处理数据的难度。
无向图邻接矩阵也有一些特殊的应用,例如用于图计算问题,比如可以用来求解最短路径问题,最小生成树问题等。
此外,通过无向图邻接矩阵来表示图的连通性也是一种重要的应用,可以用来确定图的连通分量,以及可以表达节点之间的行为关系,例如说入射网络中的服务关系,这些关系可以用来进行控制和求解各种优化问题。
最后,利用无向图邻接矩阵可以实现快速算法,用于图中节点的搜索、遍历、排序等操作,以及根据邻接矩阵计算图中节点间距离和路径,这些技术可用于多种实际应用,例如信息查询、社交网络中的用户关联等。
总之,无向图邻接矩阵具有极强的实用性,在无向图的存储和处理中可被广泛应用,可用于求解距离、路径、搜索、遍历等问题,也可以表达入射网络之间的服务关系,可以被用来进行系统的控制和优化。
因此,无向图邻接矩阵被广泛应用于算法和数据结构的实际编程中,可以用来优化现有算法,从而提高算法的效率。
条件概率图模型:无向图与有向图表示

• 社交网络中的节点表示用户,边表示用户之间的关系 • 可以使用无向图条件概率图模型来预测用户的行为和兴趣
03
有向图的条件概率图模型
有向图的条件概率图模型表示方法
有向图的条件概率图模型使用邻接矩阵表示图结构
• 邻接矩阵:一个二维矩阵,用于表示 图中节点之间的连接关系 • 对角线元素表示节点的自循环,即节 点自身对自身的依赖
应用性能的对比
无向图条件概率图模型适用于描述对称依赖关系,但在描述非对称依赖关系时性能较差
有向图条件概率图模型适用于描述非对称依赖关系,但在描述对称依赖关系时性能较差
05
条件概率图模型的未来发展趋势与挑战
模型的可扩展性与适应性研究
研究如何提高条件概率图模型的可扩展 性,使其能够处理大规模数据
研究如何提高条件概率图模型的适应 性,使其能够适应不同领域和任务
参数估计方法的优化与创新
研究如何优化条件概率图模型的参数估计方法,提高估计精度和计算效率
探索新的参数估计方法,如深度学习和神经网络等方法在条件概率图模型中的应用
应用领域的拓展觉、 自然语言处理
等
01
深入研究条件 概率图模型在 不同领域和任 务中的表现, 提高模型的性 能和实用性
02
谢谢观看
THANK YOU FOR WATCHING
条件概率图模型:无向图与有向图表示
01
条件概率图模型的基本概念
条件概率图模型的定义与应用场景
条件概率图模型(Conditional Probability Graphical Model,CPGM)是一种用于描述变量
间条件依赖关系的图模型
• 条件依赖关系:指一个变量的发生概 率受到另一个变量的影响 • 图模型:用图的结构表示变量之间的 关系,图中的节点表示变量,边表示变 量之间的依赖关系
数据结构 C语言版(严蔚敏版)第7章 图

1
2
4
1
e6 2 4
2016/11/7
29
7.3 图的遍历
从已给的连通图中某一顶点出发,沿着一 些边访遍图中所有的顶点,且使每个顶点 仅被访问一次,就叫做图的遍历 ( Graph Traversal )。 图中可能存在回路,且图的任一顶点都可 能与其它顶点相通,在访问完某个顶点之 后可能会沿着某些边又回到了曾经访问过 的顶点。 为了避免重复访问,可设置一个标志顶点 是否被访问过的辅助数组 visited [ ]。
2
1 2
V2
V4
17
结论:
无向图的邻接矩阵是对称的; 有向图的邻接矩阵可能是不对称的。 在有向图中, 统计第 i 行 1 的个数可得顶点 i 的出度,统计第 j 行 1 的个数可得顶点 j 的入度。 在无向图中, 统计第 i 行 (列) 1 的个数可得 顶点i 的度。
2016/11/7
18
2
邻接表 (出度表)
adjvex nextarc
data firstarc
0 A 1 B 2 C
2016/11/7
1 0 1
逆邻接表 (入度表)
21
网络 (带权图) 的邻接表
6 9 0 2 1 C 2 8 3 D
data firstarc Adjvex info nextarc
2016/11/7
9
路径长度 非带权图的路径长度是指此路径 上边的条数。带权图的路径长度是指路径 上各边的权之和。 简单路径 若路径上各顶点 v1,v2,...,vm 均不 互相重复, 则称这样的路径为简单路径。 回路 若路径上第一个顶点 v1 与最后一个 顶点vm 重合, 则称这样的路径为回路或环。
图的邻接矩阵表示法

图的邻接矩阵表⽰法 图常⽤的存储⽅法⼜邻接表表⽰法以及邻接矩阵表⽰法,邻接表适合稀疏矩阵的存储,但是缺点是稍微复杂⼀点,并且插⼊操作或者说更新图的操作实际上是⽐较复杂的,⽽邻接矩阵更加简单,再存储密集矩阵的时候更加合适,下⾯使⽤c++实现⼀个简单的邻接矩阵。
由于图⼀般简单的分为⼏种:1. ⽆向图 2.有向图 3.带权⽆向图 4.带权有向图下⾯可以构造的时候分别选择这⼏种⽅式来实现: 下⾯所提到的VType表⽰的是顶点的类型,⼀般设置成char或者string⽤于表⽰⽐较合适,ArcType表⽰的是弧的值类型,对于⽆权图⽤0,1分别表⽰⾮邻接以及邻接,⽽有全权图表⽰权重⼤⼩。
所有的private数据如下所⽰:1struct ArcCell{2 ArcType adj; //顶点对间关系类型,⽆权图为0或者1,表明相邻或者是不相邻,有权图代表的就是权值的⼤⼩3 };4 VType *vvec; //⽤于表⽰顶点的信息,例如char或者string等5 ArcCell ** arcs; //邻接矩阵6int vecNum; //顶点数⽬7int arcNum; //弧数⽬8 GraphKind kind; //图的种类,⾮别可以为带权有向图,⽆向图,不带权有向,⽆向图。
default constructor:1 Graph(int _vexNum = 0, GraphKind _kind = DG) :2 vecNum(_vexNum), arcNum(0), kind(_kind)3 {4 vvec = new VType[vecNum];5 arcs = new ArcCell *[vecNum];6for (int i = 0; i < vecNum; ++i){7 arcs[i] = new ArcCell[vecNum];8 }9 } destructor是non-trivial的,实际还是需要⾃⼰写⼀个的,代码如下:1 ~Graph()2 {3for (int i = 0; i < vecNum; ++i){4delete[] arcs[i];5 }6delete[] arcs;7delete[] vvec;8 } 下⾯是初始化所有的顶点信息:1void Init()2 {3 cout << "请输⼊每个顶点的关键字:" << endl;4 VType val;5for (int i = 0; i < vecNum; ++i){6 cin >> vvec[i];7 }8 ArcCell ac;9 ac.adj = 0;10for (int i = 0; i < vecNum; ++i){11for (int j = 0; j < vecNum; ++j){12 arcs[i][j] = ac;13 }14 }15 } 下⾯是根据不同类型来进⾏图的创建: 有向图:1void createDG()2 {3 Init();4int vhead, vtail;5 cout << " 请依次输⼊每条边的开始节点以及结束结点: " << endl;6while (cin >> vhead >> vtail){7 arcNum++;8 arcs[vhead][vtail].adj = 1;9 }10 } 带权有向图:1void createWDG()2 {3 Init();4int vhead, vtail;5 ArcType w;6 cout << " 请输⼊每条弧的开始顶点,结束顶点以及权值: " << endl;7while (cin >> vhead >> vtail >> w){8 arcNum++;9 arcs[vhead][vtail].adj = w;10 }11 } ⽆向图:1void createUDG()2 {3 Init();4int vhead, vtail;5 cout << "请输⼊每条弧的开始顶点,结束顶点: " << endl;6while (cin >> vhead >> vtail){7 arcNum+=2;8 arcs[vhead][vtail].adj = 1;9 arcs[vtail][vhead].adj = 1;10 }11 } 带权⽆向图:1void createWUDG()2 {3 Init();4int vhead, vtail;5 ArcType w;6 cout << "请输⼊每条弧的开始顶点,结束顶点以及弧的权重(总共的顶点数为: " << vecNum << ".)" << endl;7while (cin >> vhead >> vtail >> w){8 arcNum+=2;9 arcs[vhead][vtail].adj = w;10 arcs[vtail][vhead].adj = w;11 }12 } 图的显⽰部分:1void displayGraph()2 {3 cout << "顶点的总数为: " << vecNum << "个。
数据结构与算法教程 习题答案 作者 朱明方 吴及 第5章习题解答.docx

第5章习题解答2- 9, 0-6, 4-9, 2-6, 6-4;(1) 请确定图中各个顶点的度; (2) 给出图的连通分量;(3)列出至少有三个顶点的简单路径。
[解答]由题意得到的图如图5-1所示。
[解答]如图5-2所示,分别为1个顶点,2个顶点,3个顶点,4个顶点,5个顶点和6个顶点 的无向完全图。
5. 1 已知一个图有。
到9 一共10个顶点, 图中边为:3-7,1-4, 7-8, 0-5, 5-2, 3-8,(1)顶点:0 12 3 4 顶点的度:213232⑵连通分量1: 连通分量2: (3)连通分量1:连通分量2中:4-6-0, 4-6-2, 6-2-5, 6-2-9, 9-2-6, 0-5-2,如图5-1 (b)所示。
如图5-1 (a)所示。
3- 7-8; 1-4-6, 1-4-9 4- 9-2, 6-0-5, 6-4一9, 9—2-5,共有13条。
5.2向完全图。
请分别画出1个顶点,2个顶点, 3个顶点,4个顶点,5个顶点和6个顶点的无图5-15.3 若无向图G有15条边,有3个度为4的顶点,其余顶点的度不大于3,图G至少有多少个顶点?[解答]设图G至少有x个顶点,根据握手定理有:3 X4 + 3 (x-3) =2X15, x=9(个)5.4 试证明有/个顶点的任何无环连通图均有V -1条边。
[解答]无环连通图即为树。
根据树的性质,有V个顶点的树均有V-1条边。
5.5对于一个有r个顶点和的无向完全图,请问一共有多少个子图?[解答]V 2一共有个子图。
i=05.6对于一个有V个顶点和E条边的无向图,请给出其连通分量个数的上界和下界。
[解答]根据无向图中顶点和边的关系可知,E必然满足0WEWK(片1)/2,由分析可得到:V-E if E<V-1 c = dmin[1 if E>V-1M=V-(l + Jl + 8E)/2 E<V(V-1)/2提示:在不形成环的情况下,连通分量数目达到最小值;当某个连通分量为完全图时, 连通分量数目达到最大值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*邻接矩阵表示图,先深遍历和先广遍历*/
#include <iostream>
#include<ctime>
#include<stdlib.h>
#include<queue>
#define numV 100 //顶点数
#define numE 100 //边数
using namespace std;
bool visited[numV]; //访问标记数组
int dfn[numV]; //顶点的先深编号
//int count; //先深编号
template<class T>
struct MGraph
{
T Vlist[numV]; //顶点表
int edge[numE][numE]; //邻接矩阵
};
template<class T>
class Graph
{
public:
void CreatGraph(); //邻接矩阵生成图
void outGraph(); //输出邻接矩阵
void DFST(); //先深遍历
void DFS_1(MGraph<T>, int); //先深遍历之邻接矩阵的实现
void BFST(); //先广遍历
void BFS_1(MGraph<T>, int); //先广遍历之邻接矩阵的实现private:
int count;
MGraph<T> G;
int n; //当前定点的个数
};
template<class T>
void Graph<T>::CreatGraph()
{
srand((unsigned)time(NULL));
int j;
cout <<"请输入输入顶点数:";
cin >>n; //输入顶点数
for (int i = 0; i <n; i++) //读入顶点信息,建立顶点表
{
cout <<"输入第"<< i+1 <<"个顶点";
cin >> G.Vlist[i];
}
cout << endl;
for (int i = 0; i <n; i++)
{
for (j = i; j <n; j++)
{
if (i == j) G.edge[i][j] = 0;
else G.edge[i][j] = rand() % 2; //随机生成邻接矩阵
G.edge[j][i] = G.edge[i][j];
}
}
}
template<class T>
void Graph<T>::outGraph() //邻接矩阵的输出
{
cout <<"随机生成邻接矩阵的输出"<< endl;
int i, j;
int n1;
n1 = n;
for (i = 0; i<n; i++)
{
for (j = 0; j<n; j++)
{
cout << G.edge[i][j] <<"";
}
cout << endl;
}
}
template<class T>
void Graph<T>::DFST()
{
int i;
count = 0;
for (i = 0; i < n; i++) //访问标记数组的初始化
{
visited[i] = false;
}
cout <<"先深遍历的结果:"<< endl;
for (i = 0; i <n; i++)
{
if (!visited[i])
{
DFS_1(G, i); //先深搜索
}
}
cout << endl;
}
template<class T>
void Graph<T>::DFS_1(MGraph<T> G, int i) //对邻接矩阵深度优先搜索{
int j;
cout << G.Vlist[i] <<"";
visited[i] = true; //标记已访问的
dfn[i] = count++; //顶点的先深编号
for (j = 0; j <n; j++)
{
if ((G.edge[i][j] == 1) && (visited[j] == false))
DFS_1(G, j);
}
}
template<class T>
void Graph<T>::BFST()
{
int i;
for (i = 0; i < n; i++) //访问标记数组的初始化
{
visited[i] = false;
}
cout <<"先广遍历的结果:"<< endl;
for (i = 0; i < n; i++)
{
if (visited[i] == false)
{
BFS_1(G, i); //先广搜索
}
}
cout << endl;
}
template<class T>
void Graph<T>::BFS_1(MGraph<T> G, int k) //先广搜索从第k号顶点开始
{
int j;
queue<int> Q;
Q.push(k);
while (!Q.empty())
{
k = Q.front();
if (!visited[k]) cout << G.Vlist[k] <<"";
visited[k] = true;
Q.pop();
for (j = 0; j < n; j++)
{
if (G.edge[k][j] == 1 && visited[j] == false)
{
Q.push(j);
}
}
}
}
int main()
{
Graph<char> T; //应用之前写的随机生成的邻接矩阵,改成了模板类
T.CreatGraph();
T.outGraph();
T.DFST();
T.BFST();
return 0;
}
/*
请输入输入顶点数:6
输入第1个顶点a
输入第2个顶点b
输入第3个顶点c
输入第4个顶点d
输入第5个顶点e
输入第6个顶点f
随机生成邻接矩阵的输出0 0 0 1 0 0
0 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 1
0 1 0 1 0 1
0 0 1 1 1 0
先深遍历的结果:
a d c
b e f
先广遍历的结果:
a d c e f b
*/。