最短路径条数问题

Posted summerkiki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径条数问题相关的知识,希望对你有一定的参考价值。

技术分享

单源点的最短路径:给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径。

求解方法:Dijkstra算法,基本思想是按路径长度递增的次序产生最短路径的算法。若S为已求得最短路径的终点的集合,那么下一条最短路径(设其终点为x)或者弧(v,x),或者是中间只经过S中的顶点而最后到达顶点x的路径。

 

广度优先搜索的思想:

假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。由于在访问的过程中,要按照访问顺序来访问已访问顶点的邻接点,因此蕴含了一种“先进先出”的思想,可以使用队列来完成这个任务。

#include <iostream>
#include <queue>
#include <string.h>
#include <stdio.h>
using namespace std;

const int N=16;

int shortest_path(int G[N][N])
{
    int step[N]; //从源点出发,每个结点最快第几步到达
    int stepchoice[N]; //从源点出发,最短路径的走法有几种
    memset(step,0,sizeof(int)*N);
    memset(stepchoice,0,sizeof(int)*N);

    //广度优先搜索遍历图
    queue<int> q; //使用队列数据结构,存储当前要搜索的结点
    stepchoice[0]=1;
    q.push(0); //从源点开始遍历图

    while(!q.empty())
    {
        int from=q.front(); //当前要搜索结点为队首元素
        q.pop();
        int s=step[from]+1; //源点到from邻接点的最短距离
        for(int i=1;i<N;i++) //遍历from的所有邻接点,0是源点不遍历(因为0是源点,走的过程中不可能倒回去)
        {
            if(G[from][i]==1) //连通
            {
                if((step[i]==0)||(s<step[i]))
                {
                    step[i]=s;
                    stepchoice[i]=stepchoice[from];
                    //如果之前i已经被搜索到,但是最短距离被修改,那么相应i的邻接点们也要重新被遍历
                    //如果之前i未被搜索到,那么要继续搜索它的邻接点们
                    q.push(i);
                }
                else if(step[i]==s) //发现相同的路径
                {
                    stepchoice[i]+=stepchoice[from];
                }
            }
        }
    }

    return stepchoice[N-1];

}

int main()
{
    int G[N][N];
    memset(G,0,sizeof(int)*N*N);
    //初始化矩阵
    G[0][1]=G[0][4]=1;
    G[1][0]=G[1][2]=G[1][5]=1;
    G[2][1]=G[2][3]=G[2][6]=1;
    G[3][2]=G[3][7]=1;
    G[4][0]=G[4][5]=1;
    G[5][1]=G[5][4]=G[5][6]=G[5][9]=1;
    G[6][2]=G[6][5]=G[6][7]=G[6][10]=1;
    G[7][3]=G[7][6]=1;
    G[8][9]=G[8][12]=1;
    G[9][5]=G[9][8]=G[9][10]=G[9][13]=1;
    G[10][6]=G[10][9]=G[10][11]=G[10][14]=1;
    G[11][10]=G[11][15]=1;
    G[12][8]=G[12][13]=1;
    G[13][9]=G[13][12]=G[13][14]=1;
    G[14][10]=G[14][13]=G[14][15]=1;
    G[15][11]=G[15][14]=1;

    printf("最短路径条数:%d\n",shortest_path(G));

    return 0;
}

 

以上是关于最短路径条数问题的主要内容,如果未能解决你的问题,请参考以下文章

图 - 最短路径 (二)

[总结]最短路径算法

迪杰斯特拉算法的算法思想

最短路径 - 迪杰斯特拉(Dijkstra)算法

图-最短路径问题

求最短路径的条数