题目 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 123456789
int 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;
}
}