Write a program to find the unweighted shortest distances from any vertex to a given source vertex in a digraph.
Format of functions:
void ShortestDist( LGraph Graph, int dist[], Vertex S );
where LGraph
is defined as the following:
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
Vertex AdjV;
PtrToAdjVNode Next;
};
typedef struct Vnode{
PtrToAdjVNode FirstEdge;
} AdjList[MaxVertexNum];
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv;
int Ne;
AdjList G;
};
typedef PtrToGNode LGraph;
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.
Sample program of judge:
#include <stdio.h>
#include <stdlib.h>
typedef enum {false, true} bool;
#define MaxVertexNum 10 /* maximum number of vertices */
typedef int Vertex; /* vertices are numbered from 0 to MaxVertexNum-1 */
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
Vertex AdjV;
PtrToAdjVNode Next;
};
typedef struct Vnode{
PtrToAdjVNode FirstEdge;
} AdjList[MaxVertexNum];
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv;
int Ne;
AdjList G;
};
typedef PtrToGNode LGraph;
LGraph ReadG(); /* details omitted */
void ShortestDist( LGraph Graph, int dist[], Vertex S );
int main()
{
int dist[MaxVertexNum];
Vertex S, V;
LGraph G = ReadG();
scanf("%d", &S);
ShortestDist( G, dist, S );
for ( V=0; V<G->Nv; V++ )
printf("%d ", dist[V]);
return 0;
}
/* Your function will be put here */
Sample Input (for the graph shown in the figure):
7 9
0 1
0 5
0 6
5 3
2 1
2 6
6 4
4 5
6 5
2
Sample Output:
-1 1 0 3 2 2 1
代码:
#include <stdio.h> #include <stdlib.h> typedef enum {false, true} bool; #define MaxVertexNum 10 /* maximum number of vertices */ typedef int Vertex; /* vertices are numbered from 0 to MaxVertexNum-1 */ typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; PtrToAdjVNode Next; }; typedef struct Vnode{ PtrToAdjVNode FirstEdge; } AdjList[MaxVertexNum]; typedef struct GNode *PtrToGNode; struct GNode{ int Nv; int Ne; AdjList G; }; typedef PtrToGNode LGraph; LGraph ReadG() { /* details omitted */ int a,b; LGraph g = (LGraph)malloc(sizeof(struct GNode)); scanf("%d%d",&g -> Nv,&g -> Ne); for(int i = 0;i < g -> Nv;i ++) { g -> G[i].FirstEdge = NULL; } for(int i = 0;i < g -> Ne;i ++) { scanf("%d%d",&a,&b); PtrToAdjVNode p = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode)); p -> AdjV = b; p -> Next = g -> G[a].FirstEdge; g -> G[a].FirstEdge = p; } return g; } void ShortestDist( LGraph Graph, int dist[], Vertex S ); int main() { int dist[MaxVertexNum]; Vertex S, V; LGraph G = ReadG(); scanf("%d", &S); ShortestDist( G, dist, S ); for ( V=0; V<G->Nv; V++ ) printf("%d ", dist[V]); return 0; } /* Your function will be put here */ void ShortestDist( LGraph Graph, int dist[], Vertex S ) { for(int i = 0;i < Graph -> Nv;i ++) { dist[i] = -1; } int vis[MaxVertexNum] = {0}; dist[S] = 0; while(1) { int m = MaxVertexNum,t = -1; for(int i = 0;i < Graph -> Nv;i ++) { if(!vis[i] && dist[i] != -1 && dist[i] < m) { m = dist[i]; t = i; } } if(t == -1) break; vis[t] = 1; PtrToAdjVNode p = Graph -> G[t].FirstEdge; while(p) { if(!vis[p -> AdjV]) { if(dist[p -> AdjV] == -1 || dist[p -> AdjV] > dist[t] + 1) dist[p -> AdjV] = dist[t] + 1; } p = p -> Next; } } }