Hdu 2544 最短路 模板题

来源:互联网 发布:网络兼职诈骗案例 编辑:程序博客网 时间:2024/05/19 07:43

题目 http://acm.hdu.edu.cn/showproblem.php?pid=2544

  • 运用的是dijkstra 算法
  • dis[i]放的是 i到终点的费点,Dijk的基本思路是,每次都找到终点最近的点为起点,再每次都从起点开始更新dis 数组。
  • flag 数组 起到的作用就是标记已经用过的最小值。
#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define INF 123456789int map[110][110], dis[110], flag[110];// map 矩阵,dis 为 更新数组 flag 为标记数组int main(){    int n, m, a, b, c, minn, k;    while (cin >> n >> m, n + m)    {        memset(dis, INF, sizeof(dis));        memset(map, INF, sizeof(map));        memset(flag, 0, sizeof(flag));        for (int i = 1; i <= m; i++)        {            cin >> a >> b >> c;            map[a][b] = map[b][a] = c;        }        dis[1] = 0; k = 1;        for (int g = 1; g <= n; g++)        {            minn = INF;            for (int i = 1; i <= n; i++)            {                if (minn>dis[i] && !flag[i])//求最小值                {                    minn = dis[i]; k = i;                }            }            if (!flag[k])            {                for (int j = 2; j <= n; j++)                {                    dis[j] = min(map[k][j] + dis[k], dis[j]);//更新的时候,只更新短的路                }                flag[k] = 1;            }        }        cout << dis[n] << endl;    }}
0 0