山东大学 数据结构 实验7 图的操作

本文介绍了山东大学数据结构实验中关于图的操作,包括使用邻接矩阵创建无向图,实现BFS和DFS遍历,以及求解最短路径的方法。实验要求从节点1开始,重点讲解了BFS和DFS的遍历策略,以及Dijkstra算法的应用。同时,提供了实验代码和运行截图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验七  图的操作

一、 要求完成时间

实验开始后的第八周之前完成

二、 实验目的

掌握无向图的创建、遍历方法。

三、 实验内容

1、 创建图类,存储结构使用邻接矩阵。

2、 输入图的节点数n(不超过10个)、边数m,节点分别用1-n代表。

3、 采用“起始节点,终止节点,权值”输入图的m条边,创建图。

4、 输出从节点1开始的BFS遍历,在遍历过程中,如有多个可以选择的节点,则优先选择编号较小的节点。

5、 输出从节点1开始的DFS遍历,在遍历过程中,如有多个可以选择的节点,则优先选择编号较小的节点。

6、 输出从第1节点到第n节点最短路径的长度,如果没有路经,输出0。

四、 测试用例及答案

测试如下所有用例及答案,且确保运行后出现完全一样的输出,

(操作系统提示“请按任意键继续….”等,可以不一样。)


分析:

1.图的定义:点、边、二维数组存储点之间的关系,即是否有边。

 

2.BFS遍历:从某个初始节点开始,按序访问该点的邻接节点,并将访问过的节点加上标记lable,再将这些节点入队,依次对其进行同样的操作,遍历其邻接节点,直到所有的节点都被标记或者队列为空。

 

3.DFS遍历:与BFS遍历类似,只是对节点的邻接节点不断进行dfs遍历并做上标记,采用递归调用。直到初始节点的所有邻接节点都完成各自的dfs搜索。

 

4.最短路径:对于求解图的最短路径的常用算法是Dijkstra算法,我的想法比较简单,对于求(v,w)的最短路径,先创建二维数组,初始化为“权值”或65535,对应两点之间是否有边。通过循环遍历寻找中间节点k,使得(v,k)+(k,w)<(v,w),最后得到两点之间的最短路径。

 

以下是代码,有点略多,仅供参考,希望你写出更好的方法!



代码:

#include<iostream>
#include <string>
using namespace std;

/*---------------------异常-------------------------*/

class NoMem{    
    public:    
        NoMem(){    
        	cout<<"NoMem!"<<endl;    
        }    
};
//处理数BadInput的报错
class BadInput{    
    public:    
        BadInput(){    
        	cout<<"BadInput!"<<endl;    
        }    
};
//处理数OutOfBounds的报错
class OutOfBounds{
public:
    OutOfBounds(){
        cout<<"Out of bounds!"<<endl;
    }
};

/*---------------------Node以及LinkedQueue-------------------------*/

template <class T>class LinkedQueue;
template <class T>
class Node{
	friend LinkedQueue<T>;//友元类 
	private:
		T data;
		Node<T> *link;
}; 
template <class T>
class LinkedQueue{
	//FIFO对象
	public:
		LinkedQueue(){front = rear = 0;}//构造函数
		~Linked
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值