题意:一栋摩天大楼从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. doc转docx

    # -*- coding: utf-8-*- import win32com from win32com.client import Dispatch w = win32com.client.Disp ...

  2. 四十八、在SAP中函数参数的使用

    一.不带参数的函数定义如下 二.我们把函数内部会变化的变量以参数的形式定义,其中USING和CHANGING分别表示变量和返回值,因为so_car表示的是工作区,所以后面加上[]符号. 三.我们把2个 ...

  3. Elasticsearch 批处理

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  4. NumPy 排序、查找、计数

    章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切 ...

  5. 学习spring的第4天

    关于老式的spring+mybatis整合,使用了druid连接池,还使用了mybatis-spring依赖(用于整合的),但是这个依赖本身就使用了spring-jdbc的某些类来处理事务方面的内容, ...

  6. RPC——看这一篇就…显然不够

    引言 RPC blablabla…… RPC 知识点 扩展 有给老婆解释的如:https://www.jianshu.com/p/2accc2840a1b

  7. HDU - 6043 KazaQ's Socks(找规律)

    题意:有n双袜子,编号1到n,放在衣柜里,每天早晨取衣柜中编号最小的袜子穿,晚上将这双袜子放在篮子里,当篮子里有n-1双袜子时,清洗袜子,直到第二天晚上才洗好,并将洗好的袜子重新放回衣柜. 分析:规律 ...

  8. PrepareStatement对象进行批处理的典型步骤顺序

    https://www.yiibai.com/jdbc/preparestatement-batching-example.html 以下是使用PrepareStatement对象进行批处理的典型步骤 ...

  9. Centos7.4系统 httpd模式搭建文件服务器

    环境:服务环境:centos7.4 说明:搭建Apache文件服务器,下载路径为/opt/ymyg(下载路径根据实际需要自己定义) 步骤: 1.安装httpd服务   [root@localhost ...

  10. day23(023-递归练习)

    23.01_File类递归练习(统计该文件夹大小) * 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小(字节?) * * 从键盘接收一个文件夹路径 * 1,创建键盘录入对象 * 2,定义一个无限 ...