PTA Data Structures and Algorithms (English) 6-11
阿新 • • 發佈:2021-01-18
6-11Shortest Path [1](25point(s))
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 );
whereLGraph
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
Example:
void ShortestDist( LGraph Graph, int dist[], Vertex S ) { bool visited[MaxVertexNum]; for(int i = 0; i < Graph->Nv; i++) { dist[i] = -1; visited[i] = false; } dist[S] = 0; for(int i = 0; i < Graph->Nv; i++) { PtrToAdjVNode node; int min = -1; for(int j = 0; j < Graph->Nv; j++) { if(!visited[j] && dist[j] != -1) { if(min == -1 || dist[min] > dist[j]) { min = j; } } } if(min == -1) break; visited[min] = true; node = Graph->G[min].FirstEdge; while(node) { if(!visited[node->AdjV] && dist[node->AdjV] == -1) { dist[node->AdjV] = dist[min] + 1; } node = node->Next; } } }
思路:
1. 使用迪傑斯特拉演算法,對鄰近未訪問的節點dist+1;2. 使用廣度優先搜尋,dist+1.