UVA 10801 多线程最短路
题意:一栋摩天大楼从0层到K层,有N部电梯,每个电梯都有自己的运行速度,此外,对于某个电梯来说,并不是每一层都会停,允许在某一层进行电梯换乘,每次换乘固定消耗60秒,最终求从0层去K层的最短时间,如果不能到达,输出 IMPOSSIBLE
确实是个隐式图问题,建图并不难,只要图建好了,进行最短路即可,难点在于电梯换乘,因为电梯换乘额外消耗60s因此,不能简单的指向该层节点,结果明显不对。。。。所以我自己就想出了一个多线程的最短路,每个电梯独立建一个图,分别以0-99,100-199,200-299.。。。因为最多有五部电梯,因此,只需要最多400-499一共500个点即可,独立图中点是指相同层数,只是百位不同,所以每个相同层的点互相建边,边权为60。
图建好后进行最短路即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 1<<30
using namespace std;
int g[][];
int times[];
int lift[][];
int num[];
int d[];
int vis[];
int n,k;
void init()
{
int i,j;
for (i=;i<=;i++)
{
for (j=;j<=;j++)
{
if (i==j) g[i][j]=;
else
g[i][j]=INF;
}
d[i]=INF;
}
for (i=;i<=;i++)
{
for (j=;j<n;j++)
{
for (int w=;w<n;w++) //把不同电梯的相同层的节点进行连接,权值为60,代表换乘电梯
{
if (w==j) continue;
g[j*+i][w*+i]=;
}
}
} }
void dijstla()
{
d[]=;
int i,j;
memset(vis,,sizeof vis);
for (i=;i<=;i++)
{
int mini=INF,loc;
for (j=;j<=;j++)
{
if (vis[j]) continue;
if (mini>d[j])
{
mini=d[j];
loc=j;
}
}
vis[loc]=;
for (j=;j<=;j++)
{
if (vis[j]) continue;
if (loc==j) continue;
if (g[loc][j]>=INF) continue;
if (d[j]>d[loc]+g[loc][j])
d[j]=d[loc]+g[loc][j];
}
}
}
int main()
{
int i,j;
while (scanf("%d%d",&n,&k)!=EOF)
{
for (i=;i<n;i++)
{
scanf("%d",×[i]);
}
for (i=;i<n;i++)
{
int cur=;
char ch;
while (){
scanf("%d",&lift[i][cur++]);
ch=getchar();
if (ch=='\n') break;
}
num[i]=cur;
sort(lift[i],lift[i]+cur);
}
init();
for (i=;i<n;i++)
{
for (j=;j<num[i];j++)
{
for (int w=j+;w<num[i];w++)
{
int t1=*i+lift[i][j];
int t2=*i+lift[i][w];
g[t1][t2]=g[t2][t1]=(t2-t1)*times[i]; //分别给每个电梯建图
}
}
}
for (i=;i<n;i++)
{
if (lift[i][]==) g[][i*]=;//为防止0层有多个电梯可达,因此添加500为一个超级原点,500到各0层点权值均为0
}
dijstla();
int ans=INF;
for (i=;i<n;i++)
{
if (ans>d[i*+k])
ans=d[i*+k];
}
if (ans>=INF) puts("IMPOSSIBLE");
else printf("%d\n",ans);
}
return ;
}
UVA 10801 多线程最短路的更多相关文章
- UVA 10801 Dij最短路(改模板)
题意:有n个电梯,目的地是第K层(起点是第0层),给出每个电梯的速度,以及每个电梯能到达的层数,如果中途需要换电梯的话,时间需要+60,求到达目的地的最短时间: 思路:Dij求最短路.如果是另一条路比 ...
- uva 10801(最短路)
题目大意: 有一层不超过100层的大楼, 有n个电梯,它们的速度都不同. 而且每个电梯只能到达指定的那些楼层,而且它们都有各自的速度(即上升一层或下降一层所用的时间). 如果一个人在某层走出电梯,要换 ...
- 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)
layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...
- 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)
layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
- 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...
- uva 10801 - Lift Hopping(最短路Dijkstra)
/* 题目大意: 就是一幢大厦中有0-99的楼层, 然后有1-5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置! 问从第0层楼到第k层最少经过多长时间到达! 思路:明显的Dijkstra , ...
- UVa 10801 - Lift Hopping(dijkstra最短路)
根据题意,以每一层楼为顶点,每个电梯可以到达的两层楼之间的秒数为每一条边的权值,以此构建一个无向图.然后利用dijkstra求出最短的时间,注意每次换乘电梯需要等待60s(因为同一个电梯上的楼层是相互 ...
- UVA 10801 Lift Hopping 电梯换乘(最短路,变形)
题意: 有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算.问经过多少秒到达k层(k可以为 ...
随机推荐
- oracle学习笔记(4)
4.oracle数据库的启动流程 windows操作系统 启动监听: lsnrctl start; 启动数据库实例:oradim-startup-sid 实例名 linux系统 启动监听:lsnrct ...
- Flink笔记(二) DataStream Operator(数据流操作)
DataStream Source 基于文件 readTextFile(path) 读取 text 文件的数据 readFile(fileInputFormat, path) 通过自定义的读取方式, ...
- vue学习(六)异步组件加载
异步组件加载 首先准备-----简单的框架搭出来 <!DOCTYPE html> <html lang="zh-CN"> <head> < ...
- Oracle:文字与字符串不匹配
执行方法的时候,方法在本地跑是正常,到测试环境报错,错误代码为 ADD_MONTHS(to_date(nvl(T2.EXEC_TIME,t1.DISTRIBUTE_TIME+1),'yyyy-mm-d ...
- MVC学生管理系统-阶段III(删除学生信息)
项目源码 :https://download.csdn.net/download/weixin_44718300/11091042 前期准备,主体框架,学生列表显示 请看阶段一文章 添加学生信息 ...
- Mount error(5):Input/output error on mount
https://superuser.com/questions/850301/mount-error5input-output-error-on-mount When setting up a sha ...
- tortoiseGit 的简单使用说明
拉取仓库到本地 参考 下面几张图片,把仓库拉取到本地. 本地修改并推送 进入文件夹后,按照 下面几张图片切换到本地的开发分支 当修改完成之后,按照 下面几张图片 的方法把修改推送到远程仓库的开发分支. ...
- linux文件编辑VI命令详解
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- ACWING基础算法(三)
双指针算法. 相向双指针,指的是在算法的一开始,两根指针分别位于数组/字符串的两端,并相向行走. ACWING 的一道裸题(不知道为啥进不去404):最长连续不重复子序列 输入 5 1 2 2 3 5 ...
- 一名资深架构师规划Java程序员五年职业生涯指南
每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来.今天我给大家分享的是一篇来自阿里大牛对五年工作经验程序员的职业建议,希望 ...