zoukankan      html  css  js  c++  java
  • 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("
    ");
        for ( V=0; V<G->Nv; V++ )
            printf("%d ", path[V]);
        printf("
    ");
    
        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("
    ");
        for ( V=0; V<G->Nv; V++ )
            printf("%d ", path[V]);
        printf("
    ");
    
        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;
        }
    }
  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/8023spz/p/12255614.html
Copyright © 2011-2022 走看看