分别采用基于深度优先遍历和广度优先遍历算法判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i!=j)。注意,算法中设计的图的基本操作必须在此存储结构上实现。
对于两个不同的遍历算法,都是采用从顶点vi出发,依次遍历图中每个顶点,直到搜索到顶点vj,如果能够搜索到vj,则说明存在由顶点vi到vj的路径。
//深度优先遍历算法
int visited[MAXSIZE]={0}; //访问标记数组
int Exist_Path_DFS(ALGrapgh G, int i, int j)
{
int p; //顶点序号
//深度优先判断有向图G中顶点vi到vi是否有路径,是则返回1,否则返回0
if(i==j)
return 1; //i就是j
else
{
visited[i]=1; //置访问标记
for(p=FirstNeighbor(G, i); p>=0; p=NextNeighbor(G, i, p))
{
if(!=visited[k] && Exist_Path_DFS(G, p, j))//递归检测邻接点
return 1; //i下游的顶点到j有路径
}
}
return 0;
}
//广度优先遍历
int visited[MAXSIZE]={0};
int Exist_Path_DFS(ALGraph G, int i, int j)
{
InitQueue(Q);
Push(Q, i); //顶点入队
while(!isEmpty(Q)) //非空循环
{
DeQueue(Q, u); //队头顶点出队
visited[u]=1; //置访问标记
for(p=FirstNeighbor(G, i); p>=0; p=NextNeighbor(G, i, p))
//检查所有邻接点
{
k=p.adjvex;
if(k==j)
return 1; //若k==j,则查找成功
if(!visited[k]) //否则,顶点k入队
EnQueue(Q, k);
}
}
return 0;
}
真题可以调用以i为参数的DFS(G, I)或BFS(G, i),执行结束后判断visited[j]是否为TRUE,如果是则说明vj已被遍历,图中必存在由vi到vj的路径。