图的相关问题|图

  • 图的连通性

无向图:用图的遍历算法,调用DFS或BFS的次数就是连通分量的个数
有向图:上面的方法只能检测出非强连通分量,强连通分量见 Slides03.pdf

  • 判断有向图是否存在回路
  • 判断一个无向图是否为一棵树
    思路1:判断是否是无回路的连通图
    思路2:判断是否是n-1条边的连通图,若一次就能访问到所有的n个定点和n-1条边,那么就是一棵树。

  • 非递归DFS遍历图
    要用一个栈来存放后面回来要遍历的节点,还要一个数组来记忆第i个定点是否在栈内或者曾经在栈内。见王道书籍P201,第三题

  • 最短路径
    用DFS来遍历即可(类似树的层次遍历)

  • DFS或BFS来判断两个定点是否存在路径
    DFS的伪代码如下:

bool Exist_Path_DFS(Graph,i,j)
{
    退出条件
    if(i==j) return True
    
    访问当前节点
    visitd[i] = True
    
    for x in x_neigbourhood
        若当前节点没有被访问过 且 Exist_Path_DFS(Graph,x,j)==true
            return True;
        
}

BFS的代码跟BFS遍历的代码一样,只不过在扫描到节点j的时候就马上返回。

还一种时间复杂度每次都是上面最坏的情况的方法:用BFS或者DFS从i点开始遍历,遍历完成后看visited[j]是否被遍历过即可,但是这种方法每次都要遍历完所有的节点。

  • 设计一个算法求出从i到j所有简单路径

跟DFS是一样的,伪代码如下:

注意path和d作为参数只是在当前函数及其调用的子函数中会改变
调用,这种改变是向下的。
void FindPath(G,i,j,path[],d)
{
    path[d] = i
    d++
    
    这里找到了没有->找到了输出路径
    
    还没有找到向下
    
    for x in x_neiberhood:
        FindPath(G, i, j, path[], d)

    path[d] = 0
}

你可能感兴趣的:(图的相关问题|图)