zoukankan      html  css  js  c++  java
  • 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):

    img

    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 
    

    这道题就是Dijkstra算法,是一种贪心算法,分解开来看就是从起始点开始,找离这个顶点集最近的点,然后再更新路径。

    唯一有点困难的可能就是数相同的最短路径了。仔细想想,在Dijkstra过程中,这个应当是递增的,如果a到达b的路径有k条,而b能达到c,则ac的路径也是k条,如果bc有两条路径,则ac的路径是k+1条。

    根据这个原则,构建代码。

    int known[MaxVertexNum];
    
    void ShortestDist(MGraph Graph, int dist[], int count[], Vertex S) {
        for (int i = 0; i < Graph->Nv; i++) dist[i] = INFINITY, count[i] = 0;
        dist[S] = 0, count[S] = 1;
    
        while (S != -1) {
            known[S] = 1;
            for (int i = 0; i < Graph->Nv; i++) {
                if (!known[i]) {
                    if (dist[i] > Graph->G[S][i] + dist[S])
                        dist[i] = Graph->G[S][i] + dist[S], count[i] = count[S];
                    else if (dist[i] == Graph->G[S][i] + dist[S])
                        count[i] += count[S];
                }
            }
    
            S = -1;
            for (int i = 0, v_min = INFINITY; i < Graph->Nv; i++)
                if (!known[i] && v_min > dist[i])
                    v_min = dist[i], S = i;
        }
    
        for (int i = 0; i < Graph->Nv; i++) {
            if (dist[i] == INFINITY) count[i] = 0, dist[i] = -1;
        }
    }
    
  • 相关阅读:
    1.7 this关键字
    1.6 作用域练习题
    1.5 关于内存释放和作用域销毁的研究
    php 类与对象
    Yii2 数据操作Query Builder查询数据
    Mac 下配置Nginx安装环境配置详细说明
    PHP 面向对象
    php中static静态关键字的使用方法和应用场景
    http协议(五)web服务器
    http协议(四)http常用状态码
  • 原文地址:https://www.cnblogs.com/nonlinearthink/p/12178281.html
Copyright © 2011-2022 走看看