数据结构老师布置一道题目,憋了一天才搞出来,还是练习地不够啊!不过班里面其他人搞出来的也不多啊!
题目
PS:头文件是老师给的。
一、请建立一个空项目,添加GraphTraverseTest.cpp源文件和AdjMWGraph.h、AdjLWGraph.h、CreatAdjWGraph.h、AdjWGraphApp.h、SeqList.h、SeqQueue.h等六个头文件。其中:
AdjMWGraph.h头文件采用邻接矩阵实现带权有向图数据结构;
AdjLWGraph.h头文件采用邻接表实现带权有向图数据结构;
CreatAdjWGraph.h头文件实现邻接矩阵图的构造和邻接表图的构造;
AdjWGraphApp.h头文件实现图的应用(包括最小生成树Prim算法和最短路径Dijkstra算法)
SeqList.h头文件实现顺序表数据结构;
SeqQueue.h头文件实现顺序循环队列数据结构。
二、你的任务:
在图的应用头文件AdjWGraphApp.h中,完成Path(v0)函数,实现输出图中第v0顶点到其余各顶点的路径。
提示:(1)采用遍历实现;(2)要考虑路径的表现形式和存储结构。
我是这样实现的:
vector<int>vec_path;
bool Is_In_Vector(vector<int> &vec,int m)
{
int judge(0);
for(size_t i(0);i<vec.size();i++)
{
if(m==vec[i]) judge=1;
}
if(judge==1) return 1;
else return 0;
}
//Path函数适用于邻接矩阵带权有向图和邻接表带权有向图数据结构;
template <class GraphType>
int * Path(GraphType &G0,int v0,int vx)
{
//GrapType类,图类;
vec_path.push_back(v0);
//for循环,遍历v0指向的结点;
for(int j=0;j<G0.NumOfVertices();j++)
{
//NumberOfVertices(),结点数目;
if(j==vx) continue;
if(G0.IsEdge(v0,j)==1 && Is_In_Vector(vec_path,j)==0)
Path(G0,j,vx); //递归
}
if(G0.IsEdge(v0,vx)==1) //判断v0和vx之间是否存在边,若存在边IsEdge返回1;
{
for(size_t i=0;i<vec_path.size();i++)
{
cout<<vec_path[i];
}
cout<<vx<<" end"<<endl; //输出路径
vec_path.pop_back();
return 0;
}
else vec_path.pop_back();
}
这是一个递归算法,做得时候很别扭,要逆着想。不过做出来之后还是很有成就感滴,嘿嘿嘿嘿嘿~