UVA 10801 Dij最短路(改模板)
题意:有n个电梯,目的地是第K层(起点是第0层),给出每个电梯的速度,以及每个电梯能到达的层数,如果中途需要换电梯的话,时间需要+60,求到达目的地的最短时间;
思路:Dij求最短路。如果是另一条路比较短的话,相当于乘别的电梯,也就是再+60,自己不可能和自己比,即d[e.v] 和 d[e.u] + d + 60比较即可;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <sstream>
#include <queue>
#include <vector>
#define repu(i,a,b) for(int i=a;i<b;i++)
using namespace std;
string s;
#define N 110
int v[N],t[N];
const int maxn=;
const int INF=0x3f3f3f3f;
int rode[maxn];
int st = ,ed,k; struct Edge
{
int u, v,d;
Edge(int u, int v, int d):u(u), v(v), d(d) {}
}; struct qnode
{
int u;
int d;
qnode(int u, int d):u(u), d(d) {}
bool operator < (const qnode a)const
{
return d > a.d;
}
}; struct Dijkstra
{
int n;
vector<int> G[maxn];
vector<Edge> edge;
int d[maxn];
bool vis[maxn];
void init(int n)
{
this->n=n;
for(int i=; i<=n; i++)
{
G[i].clear();
vis[i]=;
d[i]=INF;
}
edge.clear();
}
void AddEdge(int u, int v, int d)
{
G[u].push_back(edge.size());
edge.push_back(Edge(u, v, d));
}
int dijkstra(int k)
{
memset(vis, , sizeof vis);
priority_queue<qnode> q;
d[]=;
q.push(qnode(, ));
while(!q.empty())
{
qnode x = q.top();
q.pop();
if(vis[x.u])
continue ;
vis[x.u]=true;
if(x.u == k)
return d[k] - ;
if(d[x.u] == INF) return -;
for(int i=; i<G[x.u].size(); i++)
{
Edge e=edge[G[x.u][i]];
int tep = d[e.u] + e.d + ;
if(d[e.v] > tep)
{
d[e.v] = tep;
q.push(qnode(e.v, d[e.v]));
}
}
}
return -;
}
} dij; int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
int maxn = ;
memset(v,,sizeof(v));
st = ;
ed = k;
repu(i,,n)
scanf("%d",&v[i]);
int m=;
getchar();
dij.init(N);
repu(i,,n)
{
getline(cin,s);
int l = s.length(),last = ;
m = ;
memset(t,,sizeof(t));
repu(j,,l)
{
if(s[j] == ' ')
{
string c = s.substr(last,j-last);
last = j;
stringstream ss1(c);
ss1 >> t[m];
m++;
}
}
string c = s.substr(last,l-last);
stringstream ss1(c);
ss1 >> t[m];
m++; // repu(j,0,m)
// cout<<t[j]<<" ";
// cout<<endl; repu(j,,m)
repu(p,j+,m)
{
dij.AddEdge(t[j], t[p], (t[p]-t[j])*v[i]);
dij.AddEdge(t[p], t[j], (t[p]-t[j])*v[i]);
}
}
if(k == )
{
printf("0\n");
continue;
}
int ans = dij.dijkstra(ed);
if(ans == -)
printf("IMPOSSIBLE\n");
else
printf("%d\n",ans);
}
return ;
}
UVA 10801 Dij最短路(改模板)的更多相关文章
- UVA 10801 多线程最短路
题意:一栋摩天大楼从0层到K层,有N部电梯,每个电梯都有自己的运行速度,此外,对于某个电梯来说,并不是每一层都会停,允许在某一层进行电梯换乘,每次换乘固定消耗60秒,最终求从0层去K层的最短时间,如果 ...
- uva 10801(最短路)
题目大意: 有一层不超过100层的大楼, 有n个电梯,它们的速度都不同. 而且每个电梯只能到达指定的那些楼层,而且它们都有各自的速度(即上升一层或下降一层所用的时间). 如果一个人在某层走出电梯,要换 ...
- 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...
- 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)
layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...
- 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)
layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...
- 基础最短路(模板 spfa)
Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还 ...
- 基础最短路(模板 dijkstra)
Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多 ...
- 基础最短路(模板 bellman_ford)
Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
随机推荐
- Walls(floyd POJ1161)
Walls Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7677 Accepted: 3719 Description ...
- noi 2985 数字组合
题目链接: http://noi.openjudge.cn/ch0206/2985/ 2985:数字组合 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有n个正 ...
- Annotation
Annotation是给类,方法或域上加的一种特殊的标记,可以通过反射取到注解的类型和值,从而完成某种特定的操作. 定义注解需要使用元注解,元注解有@Retention和@Target p.p1 { ...
- Python数据分析之numpy学习
Python模块中的numpy,这是一个处理数组的强大模块,而该模块也是其他数据分析模块(如pandas和scipy)的核心. 接下面将从这5个方面来介绍numpy模块的内容: 1)数组的创建 2)有 ...
- [问题2014S05] 复旦高等代数II(13级)每周一题(第五教学周)
[问题2014S05] 设 \(A,B\) 分别是 \(4\times 3\) 和 \(3\times 4\) 实矩阵, \[ BA=\begin{pmatrix}-9 & -20 & ...
- Bootstrap_按钮工具栏
单个按钮在Web页面中的运用有时候并不能满足我们的业务需求,常常会看到将多个按钮组合在一起使用,比如富文本编辑器里的一组小图标按钮等. Bootstrap框架为大家提供了按钮组组件. <div ...
- FIFO页面置换算法
本文以序列长度20的{ 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};以及页面4:为例: #include <stdio.h> #define Init ...
- GZFramework代码生成器插件使用教程
代码生成器分两种 1.基于独立exe生成程序 直接运行软件目录下GZFrameworkCodeGenerate.exe文件即可 2.基于VS插件生成 目录中分为两部分:全局缓存和VS插件 1.添加全局 ...
- Determining Current Block and Current Item in Oracle Forms
SYSTEM.CURSOR_BLOCK Determining current block in Oracle Forms Using SYSTEM.CURSOR_BLOCK system varia ...
- SQL Server索引调优系列
http://www.cnblogs.com/chenmh/category/586612.html http://www.cnblogs.com/zhijianliutang/category/63 ...