最短路径条数问题
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; }
以上是关于最短路径条数问题的主要内容,如果未能解决你的问题,请参考以下文章