Berlin Programming Contest 2004 Heavy Transportation /// dijkstra oj22604
2024-09-05 21:52:06
题目大意:
输入t;t为样例数
每个样例输入n,m;n 为顶点个数 m 为路径数
接下来m行 每行输入 u v w ;从 u 点到 v 点的路承重为 w
输出 车子若想通过 1~n的最短路 车重需限制在多少之内
Sample Input
1
3 3
1 2 3
1 3 4
2 3 5
Sample Output
Scenario #1:
4
邻接阵dijkstra
重点在此式 dis[i]=max(min(dis[ind],G[ind][i]),dis[i])
即更新 dis[] 时存入的应该是max(min(本条之前路径的承重限制,当前路段的承重限制),其他路径经过该点的承重限制)
经过同条路径 各个路段的承重限制 应选较小的
经过同一个点 各条路径的承重限制 应选较大的
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
int G[][];
int vis[],dis[];
void dijk()
{
while()
{
int maxi=-,ind;
for(int i=;i<=n;i++)
if(!vis[i] && dis[i]>maxi)
maxi=dis[i], ind=i;
if(maxi==-) break;
vis[ind]=;
for(int i=;i<=n;i++)
if(!vis[i])
dis[i]=max(min(dis[ind],G[ind][i]),dis[i]);
}
}
int main()
{
int t; scanf("%d",&t);
for(int j=;j<=t;j++)
{
scanf("%d%d",&n,&m);
memset(vis,,sizeof(vis));
memset(G,,sizeof(G));
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
G[u][v]=G[v][u]=w;
} vis[]=;
for(int i=;i<=n;i++)
if(!vis[i]) dis[i]=G[][i];
dijk();
printf("Scenario #%d:\n%d\n\n",j,dis[n]);
} return ;
}
最新文章
- [LeetCode] Nth Highest Salary 第N高薪水
- 【20160722-20160728】NOI2016滚粗记&;&;酱油记&;&;游记
- SQl浅谈 索引
- 如何用 fiddler 调试线上代码
- EmitMapper的使用
- centos7 ip地址设置
- eclipse导入Android项目后,项目的名称变为了主Activity的名称
- Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory
- 7款纯CSS3实现的炫酷动画应用
- 九度OJ 1501 最大连续子序列乘积 -- 动态规划
- 《用chsh选择shell》-linux命令五分钟系列之十二
- free 堡垒机
- C# WinForm 和 javascript进行交互 使用HTML做界面
- SLF4J: Failed to load class ";org.slf4j.impl.StaticLoggerBinder";.
- JDK下载和安装
- Oracle数据库中的重要对象
- Linux 虚拟机忘记root密码
- (三十二)虚拟机linux系统中安装firefox浏览器
- redis 相关知识
- day10_cookie&;session学习笔记