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\n", 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];

                }

            }

        }

    }

}

 

你可能感兴趣的:(HDU)