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;
    }
  • 相关阅读:
    刚才遇到了关于C#使用外部DLL函数上的char*的问题。
    重新整理过的 《C#编码规范》
    晕,完全晕了。
    Microsoft Visual Studio 2010 支持html5和css3的补丁包
    [mysql] 修改root密码和查看连接数
    Visual Studio统计有效代码行数
    [c#] 邮件附件为中文名的bug
    游戏名词解释
    [SVN] 以下后缀文件不应该提交入库
    [c#] 语言新特性
  • 原文地址:https://www.cnblogs.com/8023spz/p/7756638.html
Copyright © 2011-2022 走看看