输出从顶点Vi到Vj的所有简单路径

Posted Blocking The Sky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输出从顶点Vi到Vj的所有简单路径相关的知识,希望对你有一定的参考价值。

class Solution 
public:
    bool visited[20];
    void init()
        for(int i=0;i<20;i++)
            visited[i]=false;
    
    int firstarc(vector<vector<int>>& graph,int v)//返回v相邻的第一个结点
        int p=-1;
        if(graph[v].size()>0)//如果与v相邻有结点则返回第一个结点,没有返回-1
            p=graph[v][0];
        return p;
    
    int nextarc(vector<vector<int>>& graph,int v,int p)
        for(int i=0;i<graph[v].size();i++)//如果v结点相邻的结点p不是最后一个,则返回下一个结点
            if(graph[v][i]==p&&i<graph[v].size()-1)
                return graph[v][i+1];
        
        return -1; //如果v结点相邻的结点p是最后一个,则返回-1;
    
    vector<vector<int>> result;
    void find_path(vector<vector<int>>& graph,int start,int end,vector<int>& path)
        path.push_back(start);
        visited[start]=true;
        if(start==end)//找到一条路径则输出
            result.push_back(path);
        
        int p;
        p=firstarc(graph, start);//找到start第一个相邻结点
        while(p>=0)
            if(visited[p]==false)//如果顶点p未访问,递归访问它
                find_path(graph,p,end,path);
            
            p=nextarc(graph,start,p);//p指向start的下一个相邻结点
        
        path.pop_back();
        visited[start]=false;//恢复环境,使该节点可重新使用
    
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) 
        vector<int> path;
        init();
        find_path(graph,0,graph.size()-1,path);//dfs搜索所有路径,此处0到n-1的所有简单路径
        return result;
    
;

以上是关于输出从顶点Vi到Vj的所有简单路径的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(拓扑排序和关键路径)

数据结构(拓扑排序和关键路径)

图论中的各种术语

强连通分量-----Kosaraju

C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)

Tarjan