题意:一栋摩天大楼从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",&times[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 多线程最短路的更多相关文章

  1. UVA 10801 Dij最短路(改模板)

    题意:有n个电梯,目的地是第K层(起点是第0层),给出每个电梯的速度,以及每个电梯能到达的层数,如果中途需要换电梯的话,时间需要+60,求到达目的地的最短时间: 思路:Dij求最短路.如果是另一条路比 ...

  2. uva 10801(最短路)

    题目大意: 有一层不超过100层的大楼, 有n个电梯,它们的速度都不同. 而且每个电梯只能到达指定的那些楼层,而且它们都有各自的速度(即上升一层或下降一层所用的时间). 如果一个人在某层走出电梯,要换 ...

  3. 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)

    layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...

  4. 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)

    layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...

  5. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  6. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

  7. uva 10801 - Lift Hopping(最短路Dijkstra)

    /* 题目大意: 就是一幢大厦中有0-99的楼层, 然后有1-5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置! 问从第0层楼到第k层最少经过多长时间到达! 思路:明显的Dijkstra , ...

  8. UVa 10801 - Lift Hopping(dijkstra最短路)

    根据题意,以每一层楼为顶点,每个电梯可以到达的两层楼之间的秒数为每一条边的权值,以此构建一个无向图.然后利用dijkstra求出最短的时间,注意每次换乘电梯需要等待60s(因为同一个电梯上的楼层是相互 ...

  9. UVA 10801 Lift Hopping 电梯换乘(最短路,变形)

    题意: 有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算.问经过多少秒到达k层(k可以为 ...

随机推荐

  1. windows下移植别人配置好的python环境

    一般来说,我们在windows下配置python环境的时候可能会比较推荐用anaconda,那么有一个比较方便的anaconda环境移植方法,也就是说,如果我已经在windows上安装好了anacon ...

  2. Python基础笔记:函数:调用函数、定义函数、函数的参数、递归函数

    一.定义一个求二元一次方程的根的函数 #Sublime Text import math def ee(a,b,c): delta=b*b-4*a*c if delta<0: return 'n ...

  3. 148-PHP strip_tags函数,剥去字符串中的 HTML 标签(二)

    <?php //定义一段包含PHP代码的字符串 $php=<<<PHP 这里是PHP代码的开始 <?php echo "hello!"; PHP; $ ...

  4. Python MySQL Join

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  5. 使用Linux系统,是一种什么体验?

    导读 同事,从事嵌入式软件开发多年,主要开发环境用的就是linux,最疯狂的一段时间直接把系统装成linux系统,然后在linux下面虚拟一个windows操作系统,主要有些事情必须在windows才 ...

  6. realme发布会将于本周三在北京·幻艺术举行

    5月13日消息,realme宣布将于5月15日(本周三)在北京·幻艺术中心发布realme X. 根据官方公布的海报,realme X采用了升降全面屏方案,无挖孔.无刘海.无水滴,支持屏幕指纹识别,正 ...

  7. c++ opencv显示对话框

    IplImage *pl = cvLoadImage("e:\\3.bmp", 1); cvNamedWindow("123", 1); cvShowImage ...

  8. python阴阳鱼绘制(使用turtle)

    from turtle import * def draw(radius ,color1 , color2): #设置画笔的大小 width(3) #设置画笔颜色和填充颜色 color("b ...

  9. 八、SAP中使用MOVE来赋值

    一.使用MOVE和使用等号的效果是等同的,代码如下: 二.效果如下:

  10. DevOps专题|Packer使用教程

    什么是Packer 简单介绍一下自己 Packer 是一个轻量命令行工具, 能在几乎所有主流的操作系统上运行. 在给定一份配置文件的情况下, Packer 能为多种系统架构创建云主机镜像.同时 Pac ...