4-2 Shortest Path [4]

来源:互联网 发布:大学社团网络部职能 编辑:程序博客网 时间:2024/05/22 11:41

Write a program to find the weighted shortest distances from any vertex to a given source vertex in a digraph. If there is more than one minimum path from v to w, a path with the fewest number of edges is chosen. It is guaranteed that all the weights are positive and such a path is unique for any vertex.

Format of functions:

void ShortestDist( MGraph Graph, int dist[], int path[], 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. IfW is the vertex being visited right before V along the shortest path fromS to V, then path[V]=W. If V cannot be reached fromS, path[V]=-1, and we have path[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 path[], Vertex S );int main(){    int dist[MaxVertexNum], path[MaxVertexNum];    Vertex S, V;    MGraph G = ReadG();    scanf("%d", &S);    ShortestDist( G, dist, path, S );    for ( V=0; V<G->Nv; V++ )        printf("%d ", dist[V]);    printf("\n");    for ( V=0; V<G->Nv; V++ )        printf("%d ", path[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 403 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 3 3 3 -1 0 7 -1 0
result:
void ShortestDist( MGraph Graph, int dist[], int path[], Vertex S ){  Vertex know[MaxVertexNum]; Vertex i,j; Vertex min; for(i=0;i<Graph->Nv;i++) {  know[i]=0;  dist[i]=INFINITY;  path[i]=-1; }    dist[S]=0;while(1) {  j=-1;  min=INFINITY;    for(i=0;i<Graph->Nv;i++)    {     if(know[i]==0&&dist[i]<min)     {      j=i;      min=dist[i];     }    }     if(j==-1)   break;    know[j]=1;    for(i=0;i<Graph->Nv;i++)    {     if(know[i]==0)     {        if(dist[j]+Graph->G[j][i]<dist[i])        {      dist[i]=dist[j]+Graph->G[j][i];      path[i]=j;        }              }    }   }      for(i=0;i<Graph->Nv;i++)    {     if(dist[i]==INFINITY)     {      dist[i]=-1;     }    }    path[S]=-1;    dist[S]=0;}
0 0
原创粉丝点击