zoukankan      html  css  js  c++  java
  • 6-17 Shortest Path [2](25 分)

    Write a program to find the weighted shortest distances 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[], 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.

    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[], Vertex S );
    
    int main()
    {
        int dist[MaxVertexNum];
        Vertex S, V;
        MGraph G = ReadG();
    
        scanf("%d", &S);
        ShortestDist( G, dist, S );
    
        for ( V=0; V<G->Nv; V++ )
            printf("%d ", dist[V]);
    
        return 0;
    }
    
    /* Your function will be put here */
    

    Sample Input (for the graph shown in the figure):

    7 9
    0 1 1
    0 5 1
    0 6 1
    5 3 1
    2 1 2
    2 6 3
    6 4 4
    4 5 5
    6 5 12
    2
    

    Sample Output:

    -1 2 0 13 7 12 3
    

    不能抵达的为INFINITY,用过dijkstra算法,最后记得把INFINITY变成-1,dist[S]变成0
    代码:
    void ShortestDist( MGraph Graph, int dist[], Vertex S )
    {
        for(int i = 0;i < Graph -> Nv;i ++)
        dist[i] = Graph -> G[S][i];
        int vis[MaxVertexNum] = {0};
        vis[S] = 1;
        for(int i = 0;i < Graph -> Nv;i ++)
        {
            int min = INFINITY;
            int t = INFINITY;
            for(int j = 0;j < Graph -> Nv;j ++)
                if(!vis[j]&&dist[j] < min)min = dist[j],t = j;
            if(min == INFINITY)continue;
            vis[t] = 1;
            for(int j = 0;j < Graph -> Nv;j ++)
            {
                if(!vis[j])
                {
                    if(dist[j] > Graph -> G[t][j] + min)dist[j] = Graph -> G[t][j] + min;
                }
            }
        }
        for(int i = 0;i < Graph -> Nv;i ++)
        if(i == S)dist[i] = 0;
        else if(dist[i] == INFINITY)dist [i] = -1;
    }
  • 相关阅读:
    addEventListener
    mac截屏
    SVG Use(转)
    关于 Content-Type:application/x-www-form-urlencoded 和 Content-Type:multipart/related(转)
    promise
    apt-get update 出现E: Could not get lock /var/lib/apt/lists/lock问题的解决
    js设计模式——6.模板方法模式与职责链模式
    js设计模式——5.状态模式
    js设计模式——4.迭代器模式
    js实现超简单sku组合算法
  • 原文地址:https://www.cnblogs.com/8023spz/p/7756638.html
Copyright © 2011-2022 走看看