UVA 10801 Lift Hopping 电梯换乘(最短路,变形)
题意:
有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算。问经过多少秒到达k层(k可以为0)?
思路:
dijkstra再加一些特殊的处理就行了。首先要考虑,如何建图:
(1)每层作为一个点。但是特定路径可以有多种权,比如从2->5可以坐1号电梯10s,但是坐2号只需要5s,所以有重边。
(2)k=0时,不耗时间。
(3)有多种路径可达同一楼层且权值相同,那么从本楼层到另一楼层有多种选择,有时可以不换电梯,有时需要换。比如到达5楼的有2条路径,权都是5,但是是两部不同的电梯1和2,此时有其他电梯可以从5到7楼,其中有一部仍是电梯1,如果坐电梯1则不需要换乘时间,坐其他电梯就要了。所以要记录到某个点权值相等的电梯号。
#include <bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define INF 0x7f7f7f7f
using namespace std;
const int N=;
int take[];
char s[];
vector<int> lift[], vect[];
int cost[N], vis[N];
struct node
{
int from, to, lift, cost;
node(){};
node(int from,int to,int lift,int cost):from(from),to(to),lift(lift),cost(cost){};
}edge[];
int edge_cnt; void add_node(int from,int to,int lift,int cost)
{
edge[edge_cnt]=node(from,to,lift,cost);
vect[from].push_back(edge_cnt++);
} void build_graph(int n) //重新建图
{
for(int i=; i<n; i++)
{
for(int j=; j<lift[i].size(); j++)
{
for(int t=j+; t<lift[i].size(); t++)
{
int a=lift[i][j];
int b=lift[i][t];
add_node(a,b,i,(b-a)*take[i]);
add_node(b,a,i,(b-a)*take[i]);
}
}
}
} int dijkstra(int s,int e)
{
vector<int> flo[];
memset(cost,0x7f,sizeof(cost));
memset(vis,,sizeof(vis) ); priority_queue<pii,vector<pii>,greater<pii> > que;
que.push( make_pair(,s));
cost[s]=;
while(!que.empty())
{
int x=que.top().second;que.pop();
if(vis[x]) continue; vis[x]=;
for(int i=; i<vect[x].size(); i++)
{
node e=edge[vect[x][i]];
int ext=; for(int j=; j<flo[e.from].size(); j++) //如果有一个匹配,就不用额外时间
if( flo[e.from][j]==e.lift ) ext=; if(cost[e.to]>=cost[e.from]+ext+e.cost )
{
if( cost[e.to]>cost[e.from]+ext+e.cost ) flo[e.to].clear();
flo[e.to].push_back(e.lift); cost[e.to]= cost[e.from] +ext +e.cost;
que.push( make_pair(cost[e.to], e.to) );
}
}
}
return cost[e];
} int main()
{
freopen("input.txt", "r", stdin);
int n, k;
while(~scanf("%d%d",&n,&k))
{
for(int i=; i<n; i++) lift[i].clear();
for(int i=; i<; i++) vect[i].clear();
memset(s,,sizeof(s)); for(int i=; i<n; i++) scanf("%d",&take[i]);
getchar();
for(int i=; i<n; i++)
{
lift[i].clear();
gets(s);
int p=;
while(s[p]!='\0')
{
if(s[p]==' ') p++;
int tmp=;
while(s[p]!=' ' &&s[p]!='\0' ) tmp=tmp*+(s[p++]-'');
lift[i].push_back(tmp);
}
}
build_graph(n);
int ans=dijkstra(,k);
if(!k) puts("");
else if(ans==INF) puts("IMPOSSIBLE");
else printf("%d\n", ans- ) ;
}
return ;
}
AC代码
UVA 10801 Lift Hopping 电梯换乘(最短路,变形)的更多相关文章
- UVa 10801 - Lift Hopping(dijkstra最短路)
根据题意,以每一层楼为顶点,每个电梯可以到达的两层楼之间的秒数为每一条边的权值,以此构建一个无向图.然后利用dijkstra求出最短的时间,注意每次换乘电梯需要等待60s(因为同一个电梯上的楼层是相互 ...
- uva 10801 - Lift Hopping(最短路Dijkstra)
/* 题目大意: 就是一幢大厦中有0-99的楼层, 然后有1-5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置! 问从第0层楼到第k层最少经过多长时间到达! 思路:明显的Dijkstra , ...
- UVA 10801 Lift Hopping 最短路
2种方式直接代码就可以了.注意首次不需要60S的转换 #include <map> #include <set> #include <list> #include ...
- UVa 10801 Lift Hopping (Dijkstra)
题意:有一栋100层的大楼(标号为0~99),里面有n个电梯(不超过5个),以及要到达的层数(aid),然后是每个电梯走一层所需的时间, 再n行就是对应每个电梯可以到达的层数,数量不定.然后每装换一次 ...
- UVa 10801 Lift Hopping【floyd 】
题意:给出n个电梯,每个电梯的运行时间,每个电梯只能在相应的楼层停靠,而且没有楼梯,再给出想去的楼层,问从0层能否到达想去的楼层,求到达的最短时间 建图还是没有建出来--- 因为n<100,可以 ...
- UVa 10801 Lift Hopping / floyd
乘电梯 求到目标层的最短时间 有n个电梯 换一个电梯乘需要额外60秒 所以建图时每个电梯自己能到的层数先把时间算好 这是不需要60秒的 然后做floyd时 如果松弛 肯定是要换电梯 所以要加60秒 # ...
- UVA 10801 Lift Hopping
算是一道需要动脑筋的最短路问题了,关键在于建图部分,对于n个电梯中每一个都要经过cnt个楼层,a[0],a[1],a[2],a[3],a[4],......a[cnt-1],那么对于任意两个楼层a[j ...
- UVA 10801 多线程最短路
题意:一栋摩天大楼从0层到K层,有N部电梯,每个电梯都有自己的运行速度,此外,对于某个电梯来说,并不是每一层都会停,允许在某一层进行电梯换乘,每次换乘固定消耗60秒,最终求从0层去K层的最短时间,如果 ...
- UVA 11248 - Frequency Hopping(网络流量)
UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,如今须要从1到N运输流量C,问是否可能,假设可能输出可能,假设不可能,再问能否通过扩大一条边的容量使得可能,假 ...
随机推荐
- 使用XAMPP本地安装Wordpress博客
最近一直在研究博客,也知道了大名鼎鼎的wordpress,因此也希望动手尝试一下,看看跟网站提供的博客有何区别. 第一个问题:能什么安装wordPress,能否用tocmat? 虽然问题很可笑,但是之 ...
- Mongo:将查询结果转换为自定义类
1.自定义类 public class MyClass { public string Name { get; set; } public int Corners { get; set; } } 2. ...
- nenu contest2
http://vjudge.net/vjudge/contest/view.action?cid=54562#overview H B. Polygons http://codeforces.com ...
- PE文件结构详解(四)PE导入表
PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...
- winform窗口打开后文本框的默认焦点设置
原文:http://blog.csdn.net/kongwei521/article/details/6871411 winform窗口打开后文本框的默认焦点设置,进入窗口后默认聚焦到某个文本框,两种 ...
- iframe标签用法详解(属性、透明、自适应高度)(总结)
<iframe src="http://www.jb51.net" width="200" height="500"> 脚本之家 ...
- 读写txt文件
public void SetUpdateTime(string strNewDate) { try { var path =Application.StartupPath + Configurati ...
- SQLite数据库的体系结构(翻译自sqlite.org)
$1 简介 本文档描述了SQLite库的体系结构,这些信息对那些想理解和修改SQLite的内部工作机制的人是有用的. 下图显示了SQLite的主要组成部件及其相互关系,下面的内容将描述每一 ...
- PHP优化杂烩
讲 PHP 优化的文章往往都是教大家如何编写高效的代码,本文打算从另一个角度来讨论问题,教大家如何配置高效的环境,如此同样能够达到优化的目的. pool 一个让人沮丧的消息是绝大多数 PHP 程序员都 ...
- Python 中的isinstance函数
解释: Python 中的isinstance函数,isinstance是Python中的一个内建函数 语法: isinstance(object, classinfo) 如果参数object是cla ...