[题解]UVA10801 Lift Hopping
链接:http://vjudge.net/problem/viewProblem.action?id=22172
描述:有n部电梯,每部电梯都有不能停下的楼层,要求搭乘电梯从第0层到第k层。
思路:单源点最短路
建图:将每层楼拆成n个点,用边权解决换乘等待的时间。将每部电梯能到达的楼层顺次连接,边权是该电梯经过所需时间。最后建立一个超级源点S,连接每部电梯的第0层的节点,边权为0,方便统计答案。
下面是我的实现,Dijkstra版本:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <queue>
5 using namespace std;
6 #define MaxN 520
7 #define MaxM 3020
8 #define Max_n 8
9 #define S 500
10 #define INF 100000
11 struct node
12 {
13 int v,dist;
14 node *next;
15 };
16 node Edge[MaxM];
17 node *cnt=&Edge[0];
18 node *adj[MaxN];
19 int dist[MaxN];
20 int T[Max_n];
21 int n,K,Ans;
22 bool For_Build[MaxN];
23 inline void Clean()
24 {
25 memset(Edge,0,sizeof(Edge));
26 cnt=&Edge[0];
27 memset(adj,0,sizeof(adj));
28 }
29 inline void Addedge(int u,int v,int w)
30 {
31 node *p=++cnt;
32 p->v=v;
33 p->dist=w;
34 p->next=adj[u];
35 adj[u]=p;
36
37 p=++cnt;
38 p->v=u;
39 p->dist=w;
40 p->next=adj[v];
41 adj[v]=p;
42 }
43 inline void Read_Build()
44 {
45 int i,j,Num,f1,f2;
46 for(i=1;i<=n;i++)
47 scanf("%d",&T[i]);
48 for(i=1;i<=n;i++)
49 {
50 Num=100*(i-1);
51 Addedge(S,Num,0);
52 f1=-1;
53 do
54 {
55 scanf("%d",&f2);For_Build[Num+f2]=true;
56 if(f1!=-1)
57 Addedge(Num+f1,Num+f2,(f2-f1)*T[i]);
58 f1=f2;
59 for(j=1;j<i;j++)
60 if(For_Build[100*(j-1)+f2])
61 Addedge(100*(j-1)+f2,Num+f2,60);
62 }while(getchar()!='\n');
63 }
64 }
65 struct cmp
66 {
67 bool operator()(node a,node b)
68 {
69 return a.dist>b.dist;
70 }
71 };
72 priority_queue <node, vector<node>, cmp> q;
73 void Dijkstra(int s)
74 {
75 node c,d;
76 node *p;
77 int i,j,k;
78 memset(dist,0x3f,sizeof(dist));
79 dist[s]=0;
80 c.v=s;c.dist=0;
81 q.push(c);
82 while(!q.empty())
83 {
84 d=q.top();q.pop();
85 j=d.v;
86 for(p=adj[j];p!=NULL;p=p->next)
87 {
88 k=p->v;
89 if(dist[k]>dist[j]+p->dist)
90 {
91 dist[k]=dist[j]+p->dist;
92 d.v=k;d.dist=dist[k];
93 q.push(d);
94 }
95 }
96 }
97 }
98 inline void Print()
99 {
100 int i;
101 for(i=1;i<=n;i++)
102 Ans=min(Ans,dist[100*(i-1)+K]);
103 if(Ans==INF)
104 printf("IMPOSSIBLE\n");
105 else
106 printf("%d\n",Ans);
107 }
108 int main()
109 {
110 while(scanf("%d%d",&n,&K)!=EOF)
111 {
112 Clean();
113 Read_Build();
114 Dijkstra(S);
115 Ans=INF;
116 Print();
117 }
118 return 0;
119 }
我是用拆点的方法解决换乘等待的时间问题的,在网上看到另一种处理方式感觉很科学。本以为我的会很慢,实践证明还是算比较快的了,也可能是数据不强。

然后我再试了试spfa,稍微慢一点:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <queue>
5 using namespace std;
6 #define MaxN 520
7 #define MaxM 3020
8 #define Max_n 8
9 #define S 500
10 #define INF 100000
11 struct node
12 {
13 int v,dist;
14 node *next;
15 };
16 node Edge[MaxM];
17 node *cnt=&Edge[0];
18 node *adj[MaxN];
19 int dist[MaxN];
20 int T[Max_n];
21 int n,K,Ans;
22 bool For_Build[MaxN],vis[MaxN];
23 inline void Clean()
24 {
25 memset(Edge,0,sizeof(Edge));
26 cnt=&Edge[0];
27 memset(adj,0,sizeof(adj));
28 }
29 inline void Addedge(int u,int v,int w)
30 {
31 node *p=++cnt;
32 p->v=v;
33 p->dist=w;
34 p->next=adj[u];
35 adj[u]=p;
36
37 p=++cnt;
38 p->v=u;
39 p->dist=w;
40 p->next=adj[v];
41 adj[v]=p;
42 }
43 inline void Read_Build()
44 {
45 int i,j,Num,f1,f2;
46 for(i=1;i<=n;i++)
47 scanf("%d",&T[i]);
48 for(i=1;i<=n;i++)
49 {
50 Num=100*(i-1);
51 Addedge(S,Num,0);
52 f1=-1;
53 do
54 {
55 scanf("%d",&f2);For_Build[Num+f2]=true;
56 if(f1!=-1)
57 Addedge(Num+f1,Num+f2,(f2-f1)*T[i]);
58 f1=f2;
59 for(j=1;j<i;j++)
60 if(For_Build[100*(j-1)+f2])
61 Addedge(100*(j-1)+f2,Num+f2,60);
62 }while(getchar()!='\n');
63 }
64 }
65 queue<int>q;
66 void Spfa(int s)
67 {
68 int j,k;
69 memset(dist,0x3f,sizeof(dist));
70 dist[s]=0;
71 q.push(s);
72 vis[s]=true;
73 while(!q.empty())
74 {
75 j=q.front();
76 q.pop();
77 vis[j]=false;
78 for(node *p=adj[j];p!=NULL;p=p->next)
79 {
80 k=p->v;
81 if(dist[k]>dist[j]+p->dist)
82 {
83 dist[k]=dist[j]+p->dist;
84 if(!vis[k])
85 {
86 q.push(k);
87 vis[k]=true;
88 }
89 }
90 }
91 }
92 }
93 inline void Print()
94 {
95 int i;
96 for(i=1;i<=n;i++)
97 Ans=min(Ans,dist[100*(i-1)+K]);
98 if(Ans==INF)
99 printf("IMPOSSIBLE\n");
100 else
101 printf("%d\n",Ans);
102 }
103 int main()
104 {
105 while(scanf("%d%d",&n,&K)!=EOF)
106 {
107 Clean();
108 Read_Build();
109 Spfa(S);
110 Ans=INF;
111 Print();
112 }
113 return 0;
114 }

[题解]UVA10801 Lift Hopping的更多相关文章
- UVA-10801 Lift Hopping (最短路)
题目大意及分析:一道简单的最短路...好几天没写程序了,憋得难受!!! 代码如下: # include<iostream> # include<cstdio> # includ ...
- uva 10801 - Lift Hopping(最短路Dijkstra)
/* 题目大意: 就是一幢大厦中有0-99的楼层, 然后有1-5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置! 问从第0层楼到第k层最少经过多长时间到达! 思路:明显的Dijkstra , ...
- UVA 10801 Lift Hopping 电梯换乘(最短路,变形)
题意: 有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算.问经过多少秒到达k层(k可以为 ...
- UVa 10801 Lift Hopping【floyd 】
题意:给出n个电梯,每个电梯的运行时间,每个电梯只能在相应的楼层停靠,而且没有楼梯,再给出想去的楼层,问从0层能否到达想去的楼层,求到达的最短时间 建图还是没有建出来--- 因为n<100,可以 ...
- UVa 10801 - Lift Hopping(dijkstra最短路)
根据题意,以每一层楼为顶点,每个电梯可以到达的两层楼之间的秒数为每一条边的权值,以此构建一个无向图.然后利用dijkstra求出最短的时间,注意每次换乘电梯需要等待60s(因为同一个电梯上的楼层是相互 ...
- 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 Lift Hopping 最短路
2种方式直接代码就可以了.注意首次不需要60S的转换 #include <map> #include <set> #include <list> #include ...
- UVa 10801 Lift Hopping (Dijkstra)
题意:有一栋100层的大楼(标号为0~99),里面有n个电梯(不超过5个),以及要到达的层数(aid),然后是每个电梯走一层所需的时间, 再n行就是对应每个电梯可以到达的层数,数量不定.然后每装换一次 ...
随机推荐
- 1120day-户别确认
1.实体类 package com.edu.empity; public class People { private String hubie; private String livetype; p ...
- 【C++】自定义数据类型
自定义数据类型 标签:c++ 目录 自定义数据类型 一.结构体 定义方法: 特点: 成员访问方式: 初始化: 结构数组 指针和动态内存分配: 结构变量作为函数参数: 二.联合 定义方法: 特点: 举例 ...
- redis常见类型
1.(key) Redis 键命令用于管理 redis 的键. 语法 Redis 键命令的基本语法如下: 1 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 ...
- Python实现自动更改系统用户密码,生成随机密码
算是一个实用的例子,定制系统任务,并将随机密码上传至日志服务器,实现定期修改密码: 部分代码: 1 #!/usr/bin/env python 2 #coding:utf-8 3 import ran ...
- python16day
昨日回顾 自定义模块 模块的两种执行方式:脚本方式.调用方式 name 模块导入的方式 相对导入 random:获取随机数相关 今日内容 常用模块的介绍 time:和时间相关 datetime os ...
- React之常用技术栈
· react-redux:https://www.cnblogs.com/jingxuan-li/p/12439181.html · react-router-dom:https://www.c ...
- ApacheCN 大数据译文集 20211206 更新
PySpark 大数据分析实用指南 零.前言 一.安装 Pyspark 并设置您的开发环境 二.使用 RDD 将您的大数据带入 Spark 环境 三.Spark 笔记本的大数据清理和整理 四.将数据汇 ...
- 告别痛苦,快乐学习Pandas!开源教程《Joyful-Pandas》发布
作者:耿远昊.Datawhale团队 寄语:Pandas 是基于Numpy的一种工具,是为了解决数据分析任务而创建的,其纳入了大量库和一些标准的数据模型,提供了大量能使我们快速便捷地处理数据的函数和方 ...
- js-reduce方法源码
// 数组中的reduce方法源码复写 //先说明一下reduce原理:总的一句,reduce方法主要是把数组遍历, //然后把数组的每个元素传入回调函数中,回调函数怎么处理,就会的到什么样的效果 A ...
- HBuilderX频繁关闭,导致启动不了?
根据官方给出的指南(http://ask.dcloud.net.cn/article/35583),在我的电脑打开%appdata%下面的会有HBuilderX目录,把这个目录删除或改名就可以启动了: