最短路径问题(1)

来源:互联网 发布:淘宝客淘口令怎么设置 编辑:程序博客网 时间:2024/04/30 21:33

    作为一名小白,最近学习了Dijkstra算法,对于最短路径的解有了一定的认识,从PTA的题目来说明Dijkstra算法

4-1 Shortest Path [3]   (25分)

Write a program to not only find the weighted shortest distances, but also count the number of different minimum paths from any vertex to a given source vertex in a digraph. It is guaranteed that all the weights are positive.

Format of functions:

void ShortestDist( MGraph Graph, int dist[], int count[], Vertex S );

where MGraph is defined as the following:

typedef struct GNode *PtrToGNode;struct GNode{    int Nv;    int Ne;    WeightType G[MaxVertexNum][MaxVertexNum];};typedef PtrToGNode MGraph;

The shortest distance from V to the source S is supposed to be stored indist[V]. If V cannot be reached from S, store -1 instead. The number of different minimum paths fromV to the source S is supposed to be stored in count[V] andcount[S]=1.

Sample program of judge:

#include <stdio.h>#include <stdlib.h>typedef enum {false, true} bool;#define INFINITY 1000000#define MaxVertexNum 10  /* maximum number of vertices */typedef int Vertex;      /* vertices are numbered from 0 to MaxVertexNum-1 */typedef int WeightType;typedef struct GNode *PtrToGNode;struct GNode{    int Nv;    int Ne;    WeightType G[MaxVertexNum][MaxVertexNum];};typedef PtrToGNode MGraph;MGraph ReadG(); /* details omitted */void ShortestDist( MGraph Graph, int dist[], int count[], Vertex S );int main(){    int dist[MaxVertexNum], count[MaxVertexNum];    Vertex S, V;    MGraph G = ReadG();    scanf("%d", &S);    ShortestDist( G, dist, count, S );    for ( V=0; V<G->Nv; V++ )        printf("%d ", dist[V]);    printf("\n");    for ( V=0; V<G->Nv; V++ )        printf("%d ", count[V]);    printf("\n");    return 0;}/* Your function will be put here */

Sample Input (for the graph shown in the figure):

8 110 4 50 7 101 7 303 0 403 1 203 2 1003 7 704 7 56 2 17 5 37 2 503

Sample Output:

40 20 100 0 45 53 -1 50 1 1 4 1 1 3 0 3
void ShortestDist( MGraph Graph, int dist[], int count[], Vertex S ){int v, min;int visit[MaxVertexNum];           /*判断是否经过*/ int dist1[MaxVertexNum];for(int i=0; i<Graph->Nv; i++)     /*初始化*/ {dist[i]=Graph->G[S][i];count[i]=0;visit[i]=0;}dist[S]=0;count[S]=1;visit[S]=1;for(int i=0; i<Graph->Nv-1; i++){min=INFINITY;for(int j=0; j<Graph->Nv; j++){if(visit[j]==0&&dist[j]<min)     /*找到未遍历且距离源点最短的点*/ {v=j;min=dist[j];}}if(min==INFINITY)break;visit[v]=1;for(int j=0; j<Graph->Nv; j++){if(dist[j]>dist[v]+Graph->G[v][j])  /*更新各点距离源点的最短路径*/ {dist[j]=dist[v]+Graph->G[v][j];}}}for(int i=0; i<Graph->Nv; i++){if(dist[i]==INFINITY){dist[i]=-1;count[i]=0;}}/*寻找最短路径条数*/ for(int i=0; i<Graph->Nv; i++){visit[i]=0;dist1[i]=Graph->G[S][i];if(dist[i]==dist1[i])count[i]=1;} dist1[S]=0;count[S]=1;visit[S]=1;    for(int i=0; i<Graph->Nv-1; i++)    {    min=INFINITY;    for(int j=0; j<Graph->Nv; j++)    {    if(visit[j]==0&&dist1[j]<min)    {    v=j;    min=dist1[j];}}if(min==INFINITY)break;visit[v]=1;for(int j=0; j<Graph->Nv; j++){if(dist1[v]+Graph->G[v][j]==dist1[j])     /*找到等长的最短路径则在原有基础上增加*/ count[j]=count[j]+count[v];else if(dist1[v]+Graph->G[v][j]<dist1[j]) /*如果有更小的路径则更新最小路径条数*/ {    count[j]=count[v];    dist1[j]=dist1[v]+Graph->G[v][j];}}}}


1 0