POJ 1797

来源:互联网 发布:macvim python 配置 编辑:程序博客网 时间:2024/06/03 22:39

题目大意:有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;}