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 S
, 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
#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
- c编写 Shortest Path [4]
- c编写 Shortest Path [3]
- 4-2 Shortest Path [4]
- 4-1 Shortest Path [3]
- 4-1 Shortest Path [3]
- Shortest Path
- Shortest Path
- Shortest Path
- 4-2 Shortest Path [4]
- Dijkstra's Shortest Path - C++ for C Programmers 2.5
- 【hdu 5636】Shortest Path 中文题意&题解&代码(C++)
- hdoj 3631 Shortest Path
- hdu 3631 Shortest Path
- HDU3631 Shortest Path
- hdoj 3631 Shortest Path
- hdu 3631 Shortest Path
- hdu 3631 Shortest Path
- Hdu 3631 Shortest Path
- 1112. Stucked Keyboard (20)
- thinkphp教学系列
- 记录一下glide与Imageloader的区别。
- c 编写Public Bike Management
- oracle控制台密码修改
- c编写 Shortest Path [4]
- json数组直接转换成对象
- alibaba/druid 常见问题
- 【jzoj3630】【汕头市选2014】【分叉】【树形动态规划】
- c编写 Shortest Path [3]
- 通信算法之十六:循环卷积与线性卷积在通信系统中物理层基带中的应用
- Zeppelin使用心得
- [BCG库] CBCGPButton::SetFaceColor不能改变颜色的 解决方法
- c编写 Topological Sort