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可以为 ...
随机推荐
- 升级安装go1.13.5
运行文件时报错 verifying github.com/mattn/go-isatty@v0.0.10-0.20190818123653-bf9a1dea1961/go.mod: github.co ...
- 实现Comparator 对List<?>进行排序
首选需要有个Entity类 ,里面有属性有方法 package demo; public class Entity { private String empNo ; private String em ...
- 【转】ASP.NET Core 2.0中的HttpContext
ASP.NET Core 2.0中的HttpContext相较于ASP.NET Framework有一些变化,这边列出一些之间的区别. 在ASP.NET Framework中的 System. ...
- P 1020 月饼
转跳点:
- C++ 大文件读写
//你必须映射一个只包含一小部分文件数据的文件视图.首先映射一//个文件的开头的视图.当完成对文件的第一个视图的访问时,可以取消它的映像,然后映射//一个从文件中的一个更深的位移开始的新视图.必须重复 ...
- MFC OCX 控件事件的添加和处理
1.控件的事件一般都是由对外的接口引发到,这里定一个接口先: 该接口有一个字符串参数,表示调用者将传入一个字符串,传进来后,我们将取得字符串的长度. 2.添加事件: 事件应该是属于窗口的,所以在Ctr ...
- EUI库 - 9 - 数据集合 - 列表
List 和DataGroup的区别 1 选中一项 会触发 eui.ItemEvent.ITEM_TAP 事件, 2 有选中项的概念,可以设置 List 里的默认选中项 selectedIn ...
- 量化投资_Multicharts数组操作函数_append()追加函数(自定义)
1. Multicharts中关于数组的操作比较麻烦,而且当中所谓的动态数组的定义并不是像其他语言那种的概念.因此要对数组进行元素“”追加“”的话,需要重新更改数组的索引,然后再最后一个位置添加val ...
- HttpServlet中文乱码问题
客户端提交数据给服务器端(Requset) 如果数据中带有中文的话,有可能会出现乱码情况,那么可以参照以下方法解决. 如果是GET方式 1.代码转码 String username = request ...
- MySQL的异常问题
异常问题