您的位置:首页 > 其它

POJ 1797 - Heavy Transportation

2017-09-22 15:09 381 查看
题目大意:有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
);
if (t)
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: