6-17 Shortest Path [4] (25分)

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 11
0 4 5
0 7 10
1 7 40
3 0 40
3 1 20
3 2 100
3 7 70
4 7 5
6 2 1
7 5 3
7 2 50
3

Sample Output:

40 20 100 0 45 53 -1 50
3 3 3 -1 0 7 -1 0 

代码:
#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 */
    MGraph mg = (MGraph)malloc(sizeof(struct GNode));
    int a,b,c;
    scanf("%d%d",&mg -> Nv,&mg -> Ne);
    for(int i = 0;i < mg -> Nv;i ++) {
        for(int j = 0;j < mg -> Nv;j ++) {
            mg -> G[i][j] = INFINITY;
        }
    }
    for(int i = 0;i < mg -> Ne;i ++) {
        scanf("%d%d%d",&a,&b,&c);
        mg -> G[a][b] = c;
    }
    return mg;
}

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 */
void ShortestDist( MGraph Graph, int dist[], int path[], Vertex S ) {
    int vis[MaxVertexNum] = {0},num[MaxVertexNum];
    for(int i = 0;i < Graph -> Nv;i ++) {
        dist[i] = INFINITY;
        path[i] = -1;
    }
    dist[S] = 0;
    path[S] = -1;
    num[S] = 1;
    while(1) {
        int t = -1,m = INFINITY;
        for(int i = 0;i < Graph -> Nv;i ++) {
            if(!vis[i] && m > dist[i]) m = dist[i],t = i;
        }
        if(t == -1) break;
        vis[t] = 1;
        for(int i = 0;i < Graph -> Nv;i ++) {
            if(vis[i] || Graph -> G[t][i] == INFINITY) continue;
            if(dist[t] + Graph -> G[t][i] < dist[i]) {
                dist[i] = dist[t] + Graph -> G[t][i];
                path[i] = t;
                num[i] = num[t] + 1;
            }
            else if(dist[t] + Graph -> G[t][i] == dist[i] && num[i] > num[t] + 1) {
                num[i] = num[t] + 1;
                path[i] = t;
            }
        }
    }
    for(int i = 0;i < Graph -> Nv;i ++) {
        if(dist[i] == INFINITY) dist[i] = -1;
    }
}

原文地址:https://www.cnblogs.com/8023spz/p/12255614.html

时间: 2024-10-10 03:32:56

6-17 Shortest Path [4] (25分)的相关文章

6-16 Shortest Path [3] (25分)

Write a program to not only find the weighted shortest distances, but also count the number of different minimum paths from any vertex to a given source vertex in a digraph. It is guaranteed that all the weights are positive. Format of functions: voi

PAT A1126 Eulerian Path (25 分)

In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similarly, an Eulerian circuit is an Eulerian path which starts and ends on the same vertex. They were first discussed by Leonhard Euler while solving the fa

1126 Eulerian Path (25 分)

1126 Eulerian Path (25 分) In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similarly, an Eulerian circuit is an Eulerian path which starts and ends on the same vertex. They were first discussed by Leonhard

1150 Travelling Salesman Problem (25 分)

1150 Travelling Salesman Problem (25 分) The "travelling salesman problem" asks the following question: "Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city and retu

The Shortest Path in Nya Graph HDU - 4725

Problem Description This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand a word of this paragraph, just move on.The Nya graph is an un

PAT 1003 Emergency (25)(25 分)

1003 Emergency (25)(25 分) As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road betwe

1003 Emergency(25 分)C语言版本(提问求解答)

1003 Emergency(25 分) As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between an

pat 1046 Shortest Distance(20 分) (线段树)

1046 Shortest Distance(20 分) The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits. Input Specification: Each input file contains one test case. For

1122 Hamiltonian Cycle (25 分)

1122 Hamiltonian Cycle (25 分) The "Hamilton cycle problem" is to find a simple cycle that contains every vertex in a graph. Such a cycle is called a "Hamiltonian cycle". In this problem, you are supposed to tell if a given cycle is a H