HDU 2544

题目描述:

         HDU 2544

分析:

        Dijkstra算法的典型应用。

源码:

        
#include <stdio.h>
#include <limits.h>

//三个数组分别记录路线,最短距离,以及标志是否已经被扩展
int map[101][101], dist[101], s[101];
void dijkstra(int n, int x);

int main()
{
    int n, m, a, b, c;
    int i, j;
    while (scanf("%d%d", &n, &m) != EOF)
    {
        if (n==0 && m==0)
            break;

        //初始化数组map
        for (i = 1; i <= n; i ++)
        {
            for (j = 1; j <= n; j ++)
            {
                map[i][j] = INT_MAX;
            }
        }

        //读取所有的边
        for (i = 1; i <= m; i ++)
        {
            scanf("%d%d%d", &a, &b, &c);
            map[a][b] = map[b][a] = c;
        }

        dijkstra(n, 1);

        printf("%d
", dist[n]);
    }

    return 0;
}

void dijkstra(int n, int x)
{
    //x表示源点,n表示终点
    int mindis, u;
    int i, j;
    for (i = 1; i <= n; i ++)
    {
        dist[i] = map[x][i];
        s[i] = 0;
    }
    //扩展源点
    s[x] = 1;
    for (i = 1; i < n; i ++)  
    {
        mindis = INT_MAX;
        u = -1;
        //找出距离最小的点,然后扩展它
        for (j = 1; j <= n; j ++)
        {
            if (!s[j] && dist[j] < mindis)
            {
                u = j;
                mindis = dist[j];
            }
        }
        s[u] = 1;
        for (j = 1; j <= n; j ++)
        {
            if (s[j] == 0)
            {
                if (dist[u]+map[u][j] < dist[j] && map[u][j] < INT_MAX)
                {
                    dist[j] = dist[u] + map[u][j];
                }
            }
        }
    }
}

原文地址:https://www.cnblogs.com/bbsno1/p/3278410.html