问题链接:POJ-2387
思路
典型的最短路问题,题目要求是从后往前走,其实从前往后走也是一样的,要注意两个问题,路径是双向的,而且一条路径会有多条路程,在这个坑卡了好久……
AC代码
#include<iostream>
#include<algorithm>
using namespace std;
int cost[1005][1005];
int d[1005];
int v[1005] = { 0 };
int min(int, int);
int main()
{
int t, n;
cin >> t >> n;
fill(d, d + n + 1, 99999);
for (int i = 0; i < t; i++)
{
int a, b, c;
cin >> a >> b >> c;
if (cost[a][b] > c || cost[a][b] == 0)
{
cost[a][b] = c;
cost[b][a] = c;
}
}
d[1] = 0;
while (1)
{
int k = -1;
for (int i = 1; i <= n; i++)
if (v[i] == 0 && (k == -1 || d[i] < d[k])) k = i;
if (k == -1) break;
v[k] = 1;
for (int i = 1; i <= n; i++)
{
if (cost[k][i] == 0) cost[k][i] = 99999;
d[i] = min(d[i], d[k] + cost[k][i]);
}
}
cout << d[n] << endl;
return 0;
}
int min(int x, int y)
{
if (x <= y) return x;
else return y;
}