数据结构实验三
域中的重要场所,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间), 试设计一个交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一场所 到达另一场所。
2)实验要求:利用 Dijkstra 算法求最低的票价 3) 实现提示:
该问题可以归结为一个求带权有向图中顶点间最短路径的问题。 建立以票价为权的有向图,再利用 Dijkstra 算法求最短路径及其路径长度。
}ArcNode; //表结点 # define VertexType int //顶点元素类型
typedef struct VNode { int degree,indegree; //顶点的度,入度 VertexType data; ArcNode *firstarc;
}Vnode /*头结点*/, AdjList[MAX_VERTEX_NUM]; typedef struct{
3.给定实际背景,解决最短路径问题。 数据结构为: typedef struct Graph{ int vertex[MAX_VERTEX_NUM];//顶点 int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 }Graph; 本题还是采用的是邻接矩阵来存储图,用一个一维数组 vertex 来存放顶点本身,用一个
3)实验提示: 图的存储可采用邻接表或邻接矩阵; 图存储数据类型定义 (邻接表存储)
# define MAX_VERTEX_NUM 8 //顶点最大个数 typedef struct ArcNode
{ int adjvex; struct ArcNode *nextarc; int weight; //边的权
4.利用最小生成树算法解决通信网的总造价最低问题 1)问题描述:若在 n 个城市之间建通信网络,架设 n-1 条线路即可。如何以最低的经济
代价建设这个通信网,是一个网络的最小生成树问题。 2)实验要求:利用 Prim 算法求网的最小生成树。 3) 实现提示:通信线路一旦建立,必然是双向的。因此,构造最小生成树的网一定是无
测试结果:
4.利用最小生成树算法解决通信网的总造价最低问题。 数据结构为: typedef struct Graph{ int vertex[MAX_VERTEX_NUM];//顶点 int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 }Graph; 本题仍然采用的是邻接矩阵来存储图,用一个一维数组 vertex 来存放顶点本身,用一个
2. 教学计划编制问题。
数据结构为: typedef struct Graph{
int vertex[MAX_VERTEX_NUM];//顶点 int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 }Graph; 本题依旧采用的是邻接矩阵来存储图,用一个一维数组 vertex 来存放顶点本身,用一个 二维数组 adj 来表示各个顶点之间的邻接关系。 拓扑排序。首先增设一个一维数组 indegree 来存放每一个顶点的入度。入度为零表示没 有前驱节点,删除该顶点以及它的出弧就等价于弧头顶点的入度减 1。要实现拓扑算法可以借 助堆栈,凡是网中入度为零的顶点都将其进栈。具体步骤为:1)将没有前驱结点(入度为零) 的顶点进栈;2)从栈中退出栈顶元素输出,并把该顶点引出的所有弧删去,即把它的各个邻 接点的入度减 1,同时将当前已输出的顶点个数加 1;3)将新的入度为零的顶点再进栈;4) 重复 2)、3)两步,直到栈空为止。此时或者已输出全部顶点,或者剩下的顶点没有入度为 零的顶点。 栈在这里的作用只是保存当前入度为零的顶点,并使之处理有序。 测试结果:
AdjList vertices; int vexnum,arcnum;//顶点的实际数,边的实际数 }ALGraph; 4)注意问题: 注意理解各算法实现时所采用的存储结构。 注意区别正、逆邻接。 2. 教学计划编制问题
1)问题描述:软件专业的学生要学习一系列课程,其中有些课程必须在其先修课完成后 才能学习。
/*队列的数据结构*/ typedef struct {
int elem[MAX_VERTEX_NUM]; int front,rear; }Queue; Graph G; int visited[MAX_VERTEX_NUM]; Graph CreateAG(int n,int m) { int i=0,j=0,a=0,b=0; for(i=0;i<n;i++) {
程序运行 20 分
回答问题 15 分
实验报告 30 分
特色 考勤违
功能 纪情况 成绩
5分
5分
其它批改意见:
考核 内容
评价在实验 课堂中的表 现,包括实 验态度、编 写程序过程 等内容等。
□功能完善, □功能不全 □有小错 □无法运行
○正确 ○基本正确 ○有提示 ○无法回答
○完整
○较完整 ○一般 ○内容极少
二维数组 adj 来表示各个顶点之间的邻接关系,二维数组的值表示权值。 Dijkstra 算法。为了球最短路径采用三个数组:1)S 数组,S[i]=0 表示顶点 i 未进入 S
集合,S[i]=1 表示顶点 i 已进入 S 集合;2)dist[i]表示当前已知的从源点到顶点 i 的最短 路径长度;3)path[i]表示在当前已知的从源点到顶点 i 的最短路径上,i 前面的那个顶点的 下标。把图中顶点集合 V 分成两组,第一组为已求出最短路径的顶点集合(用 S 表示,初始 时 S 中只有一个源点,以后每求得一条最短路径 , 就将加入到集合 S 中,直到全部顶点都加 入到 S 中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用 U 表示),按最 短路径长度的递增次序依次把第二组的顶点加入 S 中。在加入的过程中,总保持从源点 v 到 S 中各顶点的最短路径长度不大于从源点 v 到 U 中任何顶点的最短路径长度。此外,每个顶点 对应一个距离,S 中的顶点的距离就是从 v 到此顶点的最短路径长度,U 中的顶点的距离,是 从 v 到此顶点只包括 S 中的顶点为中间顶点的当前最短路径长度。
○有 ○无
○无报告
○有 ○无
教师签字:
一、实验目的 1、 实验目的:通过实验使学生理解图的主要存储结构,掌握图的构造算法、图的深度优先和 广度优先遍历算法,能运用图解决具体应用问题。
二、实验题目与要求 要求:第 1 题 为必做题,2,3,4 至少选一 1.输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。
2)实验要求:假设每门课程的学习时间为一个学期,试为该专业的学生设计教学计划, 使他们能在最短时间内修完专业要求的全部课程。
3) 实现提示: 以顶点代表课程,弧代表课程的先后修关系,按课程先后关系建立有向无环图。 利用拓扑排序实现。
3.给定实际背景,解决最短路径问题 1)问题描述:假设以一个带权有向图表示某一区域的公交线路网,图中顶点代表一些区
1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能: 1…图的建立 2…深度优先遍历图 3…广度优先遍历图 0…结束
2)实验要求:在程序中定义下述函数,并实现要求的函数功能: CreateGraph(): 按从键盘的数据建立图 DFSGrahp():深度优先遍历图 BFSGrahp():广度优先遍历图
向网。为简单起见,图的顶点数不超过 10 个,网中边的权值设置成小于 100。
三、 实验过程与实验结果 1.输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。
数据结构为: typedef struct Graph{
int vertex[MAX_VERTEX_NUM];//顶点信息 int adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 }Graph; 本题采用的是邻接矩阵来存储图,用一个一维数组 vertex 来存放顶点本身,用一个二维 数组 adj 来表示各个顶点之间的邻接关系。 图的深度优先遍历,从图中任一顶点 v 开始访问,然后访问它的任一邻接顶点 w1;再从 w1 出发,访问与其邻接但还没访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,···, 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止;接着退回一部,回溯到 u 的前一个邻接点,看它是否还有其它没有被访问的邻接点。如果有,则访问此节点;若没有, 就再退回一步进行搜索。重复上述过程,直至图中所有和 v 连通的顶点都被访问到。 图的广度优先遍历,要借助队列实现。广度优先搜索类似于树的层次遍历过程。它需要 借助一个队列来实现。要想遍历每一个顶点,我们可以设 v 为第一层,再逐个遍历每一层的 每个顶点。首先创建一个 visited 数组,用来记录已被访问过的顶点,然后创建一个队列, 用来存放每一层的顶点。从图中的 v 开始访问,将已访问过的 visited[v]数组的值设置为 true,同时将 v 入队。只要队列不空,则重复如下操作:(1)队头顶点 u 出队。(2)依次检查 u 的所有邻接顶点 w,若 visited[w]的值为 false,则访问 w,并将 visited[w]置为 true,同 时将 w 入队。 测试结果:
为实现 Prim 算法,需设置一个辅助数组 closedge,以记录从 U 到 V-U 具有最小权值的边。 对每个顶点 v 属于 V-U,在辅助数组中存在一个相应分量 closedge[v],它包括两个域,其中 lowcost 域用来保存集合 U 中各顶点与该顶点构成的边中具有最小权值的边的权值。即 closedge[v].lowcost = min{wuv|u∈U}。假设初始状态时 U={k}(k 为出发的顶点),这时有 closedge[k]. lowcost=0,表示顶点 k 已加人集合 U 中。然后不断选取权值最小的边(v,u)(u ∈U,v∈V-U),每选取一条边,就将 closedge[ v]. lowcost 置为 0,表示顶点 v 加入集合 U。 由于顶点 v 从集合 V-U 进人集合 U 后,这两个集合的内容发生了变化,就需要依据新的情况 更新每一个不属于 U 集的顶点的 lowcost 值。然后再选取出 lowcost 值最小的顶点加人集合 U,依次类推,直至所有顶点都加入集合 U 为止。