试写一算法,判断以邻接表方式存储的有向图中是否存在由顶点Vi到顶点Vj的路径(i<>j)。注意:算法中涉及的图的基本操作必须在存储结构上实现。
在有向图中,判断顶点Vi和顶点Vj间是否有路径,可采用遍历的方法,从顶点Vi出发,不论是深度优先遍历(dfs)还是宽度优先遍历(bfs),在未退出dfs或bfs前,若访问到Vj,则说明有通路,否则无通路。设一全程变量flag。初始化为0,若有通路,则flag=1。
算法 int visited[]=0; //全局变量,访问数组初始化
int dfs(AdjList g , vi)
// 以邻接表为存储结构的有向图g,判断顶点Vi到Vj是否有通路,返回1或0表示有或无
{ visited[vi]=1; //visited 是访问数组,设顶点的信息就是顶点编号。
p=g[vi].firstarc; // 第一个邻接点。
while ( p!=null)
{ j=p->adjvex;
if (vj==j) { flag=1; return (1);} //vi 和 vj 有通路。
if (visited[j]==0) dfs(g,j);
p=p->next ; }//while
if (!flag) return(0);
}// 结束