一、试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到vj的路径(i≠j)。注意算法中涉及的图的基本操作必须在此存储结构上实现。
答:
本题需要以邻接表的方式来实现DFS算法从而判断是否存在从一点到另一点的路径。由所学知识可以知道,实现DFS方式的方式有两种,用栈或者递归的方式。在这道题,使用递归的方式进行实现。
该算法实现的伪代码如下:
/* 函数名称:给定图中,判断给定两点之间是否存在路径 传入参数:图G,起点start,终点end 返回值:bool型 如果有返回true,否则返回false */ bool DFS(Graph G, int start, int end) { EdgeNode *p; //如果找到了路径返回真 if(start == end) { return true; } //标记起始点 visited[start] = true; p = G.adjlist[start].firstedge; //得到与起始点相连的边 while(p) { int index = p -> adjVexIndex; //获得该边对应的标号 if(!visited[index] && DFS(G, index, end)) { //利用递归的方式继续进行寻找 return true; } p = p -> next; } return false; //如果找到最后也没找到证明没有路径 } |
算法分析:由所学知识,我们能很容易知道DFS的时间复杂度为O(n+e)。如果直接使用暴力搜索的话,会造成巨大的时间开销。综上,这是解决该问题的较好的方法。