实验要求:
- 创建图类,存储结构使用邻接矩阵。
- 输入图的节点数n(小于10个)、边数m,节点分别用1-n代表。
- 采用“起始节点,终止节点,权值”输入图的m条边,创建图。
- 输出从节点1开始的BFS遍历,在遍历过程中,如有多个可以选择的节点,则优先选择编号较小的节点。
- 输出从节点1开始的DFS遍历,在遍历过程中,如有多个可以选择的节点,则优先选择编号较小的节点。
- 输出从第1节点到第n节点最短路径的长度,如果没有路经,输出0。
(输出格式如下图所示)
实验难点:
- 自己定制图类(因为懒,所以定制图类是能省则省,能不写就不写,嘿嘿);
- 寻找最短路径的Dijkstra算法(也可以用深度优先搜索算法来实现,但是因为学习了Dijkstra算法,所以用来练习,难点);
- 控制输出格式,尤其是逗号,下面的算法用了commaFlag来实现逗号输出控制(讨巧实现);
- 对于STL中的list和queue的使用(也可以用自己写的,但是我懒,所以用现成的,嘿嘿);
- 要时刻注意一些细节,比如邻接数组的边界,new的数组的初始化和释放等等。
//my solution
#include <iostream>
#include <queue>
#include <list>
#include <algorithm>
#include <iterator>
#define label 1//reached label
#define noPredecessor 0//no predecessor
#define maxCapacity 11
using namespace std;
//weighted graph(desribed by ajacency matrix)
template<class T>
class Graph
{
public:
Graph(int = 0, T = (T)0);
~Graph() {
clearMatrix(); };
void creatGraph(int);
void insertEdge(int, int, T);
//both bfs and dfs are traverrsal from vertex 1
void bfs() const;
void dfs() const;
void realDfs(int, bool*, bool) const;
void shortestPath() const;
void clearMatrix();
protected:
int vertexNum;
int edgeNum;
T** ajacencyMatrix;
T noEdge;
};
template<class T>
Graph<T>::Graph(int vn,T theNoEdge)
{
vertexNum = vn;
edgeNum = 0;
noEdge = theNoEdge;
//creat ajacency matrix
ajacencyMatrix = new T* [vn + 1];
for (int i =</