c编写 Shortest Path [4]

来源:互联网 发布:package java 编辑:程序博客网 时间:2024/06/02 05:44
4-2 Shortest Path [4]   (10分)

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 in dist[V]. If V cannot be reached from S, store -1 instead. If W is the vertex being visited right before V along the shortest path from S to V, then path[V]=W. If V cannot be reached from Spath[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
#include <stdio.h>#include <stdlib.h>#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;}MGraph ReadG(){MGraph P;int i,j,k;P=(MGraph)malloc(sizeof(struct GNode));scanf("%d%d",&P->Nv,&P->Ne);for( j=0;j<MaxVertexNum;j++){for( k=0;k<MaxVertexNum;k++){P->G[j][k]=-1;}}for( i=0;i<P->Ne;i++){int m,n;scanf("%d%d",&m,&n);scanf("%d",&P->G[m][n]);}return P;}/* Your function will be put here */void ShortestDist( MGraph Graph, int dist[], int path[],Vertex S){int findmin(MGraph graph,int d[],int know[]);int i;Vertex known[MaxVertexNum];Vertex V,W;for(i=0;i<Graph->Nv;i++){dist[i]=INFINITY;path[i]=-1;known[i]=-1;}dist[S]=0;for(;;){V=findmin(Graph,dist,known);if(V==-1)break;known[V]=1;for(W=0;W<Graph->Nv;W++){if(Graph->G[V][W]>0){if(dist[V]+Graph->G[V][W]<dist[W]){dist[W]=dist[V]+Graph->G[V][W];path[W]=V;}}}}for(i=0;i<Graph->Nv;i++){if(dist[i]==INFINITY){dist[i]=-1;}}}int findmin(MGraph graph,int d[],int know[]){int i;int count=0;int min;for(min=0;min<graph->Nv;min++){if(know[min]==-1)break;}for(i=0;i<graph->Nv;i++){if(d[min]>d[i]&&know[i]==-1)min=i;if(know[i]==1)count++;}if(count!=graph->Nv)return min;else return -1;}
0 0
原创粉丝点击