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可以为 ...
随机推荐
- List实体类、DataTable与xml互转
序列化常用Attribute讲解说明 [XmlRootAttribute("MyCity", Namespace="abc.abc", IsNullable=f ...
- Python MySQL 插入表
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...
- NumPy 基于已有数据创建数组
原文:Python Numpy 教程 章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基 ...
- js 工厂设计模式
class Product{ constructor(name){ this.name = name; } init(){ alert(this.name); } } function Creator ...
- 【数据库】Function&Procedure&Package
Function/Procedure都是可独立编译并存储在数据库中的,区别是Function有返回值. Package则是数据和过程.函数的集合体. CREATE PROCEDURE dorepeat ...
- CodeForces - 401C Team(简单构造)
题意:要求构造一个字符串,要求不能有连续的两个0在一起,也不能有连续的三个1在一起. 分析: 1.假设有4个0,最多能构造的长度为11011011011011,即10个1,因此若m > (n + ...
- css ~ a标签占满父级元素
width: 100%; height: 100%; display: block;
- html通配符
♠ ♠ ♠ 黑桃 ♣ ♣ ♣ 梅花 ♥ ♥ ♥ 红桃,心 ♦ ♦ ♦ 方块牌 ◊ ◊ ◊ 菱形 † † † 匕首 ‡ ‡ ‡ 双剑号 ¡ ¡ ¡ 反向感叹号 ¿ ¿ ¿ 反向问号 ← ← ← 左箭头 ...
- event recorder 学习手记
#define EventStopA(slot) EventRecord2 (0xEF20U+EventLevelError+((slot) & 0xFU), ((uint32_t) __FI ...
- 使用navicat连接mysql8.0.12版本 出现client does not support。。。解决办法
navicat版本的问题 出现连接失败的原因:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password ...