题目大意:由1走到n的最短时间,t条路,每条路包括两个点,以及从一点走到另一点需要花的时间。
解题思路:dijkstra算法。做法是这样的,首先初始化,将所有的点之间的距离初始化为INF,以及除了起点1以外的与起点的距离也初始化为INF。输入的距离与此时两点之间的距离取小更新为两点之间的距离(之后的输入可能有更短的距离),算法循环n次,每次查找一个到起点的最短距离,并标记,下次不会再取同一点。查找到这个点以后,对所有到起点的距离进行更新,更新方式就是该点到起点的距离与查找到的最短距离加上查找到的该点到更新点的距离,取小。
ac代码:
#include <iostream>
#include <cstring>
#define INF 100005
using namespace std;
int T, n, vis[1005], w[1005][1005], t1;
int t2, t3, dis[1005];
void init()
{
memset(vis, 0, sizeof(vis));
for (int i=1; i<=n; i++){
dis[i] = INF;
for (int j=1; j<=n; j++)
w[i][j] = INF;
}
dis[1] = 0;
vis[1] = 1;
}
void dijkstra()
{
for (int i=1; i<=n; i++){
t3 = INF;
for (int j=2; j<=n; j++)
if (!vis[j] && t3 > dis[j])
t1 = j, t3 = dis[j];
vis[t1] = 1;
for (int j=1; j<=n; j++)
if (!vis[j] && w[t1][j] < INF)
if (dis[j] > t3 + w[t1][j])
dis[j] = t3 + w[t1][j];
}
}
int main()
{
while (scanf("%d%d", &T, &n)!=EOF){
init();
for (int i=0; i<T; i++){
scanf("%d%d%d", &t1, &t2, &t3);
w[t1][t2] = min(w[t1][t2], t3);
w[t2][t1] = w[t1][t2];
}
for (int i=2; i<=n; i++)
dis[i] = w[1][i];
dijkstra();
printf("%d\n", dis[n]);
}
return 0;
}