实验七 图的操作
一、 要求完成时间
实验开始后的第八周之前完成
二、 实验目的
掌握无向图的创建、遍历方法。
三、 实验内容
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