• 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:

    void ShortestDist( MGraph Graph, int dist[], int count[], 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. The number of different minimum paths from V to the source S is supposed to be stored in count[V] and count[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 count[], Vertex S );
    
    int main()
    {
        int dist[MaxVertexNum], count[MaxVertexNum];
        Vertex S, V;
        MGraph G = ReadG();
    
        scanf("%d", &S);
        ShortestDist( G, dist, count, S );
    
        for ( V=0; V<G->Nv; V++ )
            printf("%d ", dist[V]);
        printf("
    ");
        for ( V=0; V<G->Nv; V++ )
            printf("%d ", count[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 30
    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 
    1 1 4 1 1 3 0 3 

    代码:
    #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 count[], Vertex S );
    
    int main()
    {
        int dist[MaxVertexNum], count[MaxVertexNum];
        Vertex S, V;
        MGraph G = ReadG();
    
        scanf("%d", &S);
        ShortestDist( G, dist, count, S );
    
        for ( V=0; V<G->Nv; V++ )
            printf("%d ", dist[V]);
        printf("
    ");
        for ( V=0; V<G->Nv; V++ )
            printf("%d ", count[V]);
        printf("
    ");
    
        return 0;
    }
    
    /* Your function will be put here */
    void ShortestDist( MGraph Graph, int dist[], int count[], Vertex S ) {
        int vis[MaxVertexNum] = {0};
        for(int i = 0;i < Graph -> Nv;i ++) {
            dist[i] = INFINITY;
            count[i] = 0;
        }
        dist[S] = 0;
        count[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];
                    count[i] = count[t];
                }
                else if(dist[t] + Graph -> G[t][i] == dist[i]) {
                    count[i] += count[t];
                }
            }
        }
        for(int i = 0;i < Graph -> Nv;i ++) {
            if(dist[i] == INFINITY) dist[i] = -1;
        }
    }
  • 相关阅读:
    交叉编译fw_printenv
    解压 xxxx.cpio.gz.u-boot
    创建Uboot 环境变量 bin 文件
    Linux快速显示图片
    移动终端的GPU显卡介绍
    Video Mode Timings
    change systemd service
    device tree DTB DTC 相互转换
    如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
    解决h5在ios 微信中 input框键盘收起 页面底部留白
  • 原文地址:https://www.cnblogs.com/8023spz/p/12255577.html
Copyright © 2020-2023  润新知