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;
        }
    }
  • 相关阅读:
    团队项目选题参考
    结对编程2——单元测试
    个人作业2——英语学习APP案例分析
    js创建数组
    oracle常用函数
    Oracle聚合函数
    Myeclipse10破解版安装包
    Myeclipse按包装SVN
    Eclipse安装SVN
    Git使用教程
  • 原文地址:https://www.cnblogs.com/8023spz/p/12255614.html
Copyright © 2011-2022 走看看