题目大意:有t个样例,每个样例要求从1走到n,有m条路,每条路信息包括路的两端点,以及通过这段路的时间。求走到n使得走的各段路的最小值为最大的。
解题思路:dijkstra,修改一下寻找的。dis[i]表示走到i各段路的最小值的最大。初始化为0,先找出距离起点最远的,用最远的进行松弛,松弛操作改变一下就可以了。
ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int t, n, m, dis[1005], w[1005][1005], t1, t2, t3, vis[1005], cnt=1;
int main()
{scanf("%d", &t);while (t--){scanf("%d%d", &n, &m);memset(vis, 0, sizeof(vis));for (int i=1; i<=n; i++){dis[i] = 0;for (int j=1; j<=n; j++)w[i][j] = 0; }for (int i=0; i<m; i++){scanf("%d%d%d", &t1, &t2, &t3);w[t1][t2] = w[t2][t1] = t3; }for (int i=2; i<=n; i++)dis[i] = w[i][1];vis[1] = 1;for (int i=0; i<n; i++){t3 = 0;for (int j=2; j<=n; j++)if (t3 < dis[j] && !vis[j])t3 = dis[j], t1 = j;vis[t1] = 1;for (int j=1; j<=n; j++)if (!vis[j])dis[j] = max(dis[j], min(t3, w[j][t1]));}printf("Scenario #%d:\n", cnt++);printf("%d\n", dis[n]);if (t)printf("\n");}
return 0;
}