POJ 2267 From Dusk till Dawn or: Vladimir the Vampire(最短路变形)
题意:
有一个吸血鬼要旅游, 他只能在晚上6点到第二天凌晨6点行动(18:00 ~ 6:00), 然后每天中午12点要喝1L的血(12:00), 现有m条火车的发车时间和行程时间, 问他从a到达b需要喝多少升的血。
分析:
根据发车时间和题意, 可以把发车时间 < 18的排除掉, 然后行程时间 > 6的排除掉, 我们可以把一天看成30小时, 加起来大于30的都排除掉。
然后以血量为花费进行最短路, 如果能在同一天换乘的话, 血量花费为0, 否则为1。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i = a; i < b; i++)
#define _rep(i,a,b) for(int i = a; i <= b; i++)
const int maxn = ;
const int inf = 1e9;
struct edge{
int to, st, end_time;
edge(int _to,int _st,int _end_time): to(_to) ,st(_st), end_time(_end_time){}
};
struct node{
int to, arr_time; //到达城市, 到达时间
node(int _to, int _arr_time): to(_to) , arr_time(_arr_time){}
};
vector<edge> G[maxn];
map<string , int> id;
int city_cnt, m; void init(){
for(int i = ; i < maxn; i++) G[i].clear();
id.clear();
city_cnt = ;
}
void s2i(string s){//把城市名称映射成数字
if(!id.count(s)) id[s] = city_cnt++;
} int spfa(int from, int to){
int dis[maxn][ + ]; //dis[i][j]代表在j点到达i城市需要最少血量
bool vis[maxn][ + ];//代表[i][j](j点到达i城市需要最少血量)在不在队列中
rep(i,,city_cnt) _rep(j,,) dis[i][j] = inf;
memset(vis, , sizeof(vis));
queue<node> q;
_rep(i,,){
vis[from][i] = ;
dis[from][i] = ;
q.push(node(from,i));
}
while(!q.empty()){
node f = q.front();
int u = f.to, t = f.arr_time;
rep(i,,G[u].size()){
int st_time = G[u][i].st, v = G[u][i].to, ed_time = G[u][i].end_time;
if(t <= st_time){//在同一天可以赶上这趟火车 if(dis[v][ed_time] > dis[u][t]){ //不需要带1L血
dis[v][ed_time] = dis[u][t];
if(!vis[v][ed_time]){
vis[v][ed_time] = ;
// printf("same day\n");
q.push(node(v,ed_time));
}
}
}
else //同一天赶不上这趟火车, 需要带上1L血
{
if(dis[v][ed_time] > dis[u][t] + ) //这个+1就是1L血
{
dis[v][ed_time] = dis[u][t] + ;
if(!vis[v][ed_time]){
vis[v][ed_time] = ;
q.push(node(v, ed_time));
}
}
}
}
vis[u][t] = ;
q.pop();
}
int min_dis = inf;
_rep(i,,){//枚举目标城市每个到达时间的最少血量, 选最少的一个为答案
min_dis = min(min_dis, dis[to][i]);
}
return min_dis;
}
int main(){
int T, kase = ;
cin >> T;
while(T--){
init();
string from, to;
cin >> m;
rep(i,,m){
string u , v;
int st, dur;
cin >> u >> v >> st >> dur;
s2i(u),s2i(v);
if(st <= ) st += ;//如果起始时间小于6, 那么当24 + st小时算
if(!(st >= && st + dur <= )) continue; //总时间小于30, 起始时间大于18都是符合题意的。
G[id[u]].push_back(edge(id[v],st, st + dur));
}
cin >> from >> to;
s2i(from),s2i(to);
cout << "Test Case " << kase++ <<".\n";
int blood = spfa(id[from], id[to]);
if(blood == inf){
cout << "There is no route Vladimir can take.\n";
}else{
cout << "Vladimir needs " << blood << " litre(s) of blood.\n";
}
}
}
POJ 2267 From Dusk till Dawn or: Vladimir the Vampire(最短路变形)的更多相关文章
- UVA 10187 From Dusk Till Dawn /PC 110907
不吐槽.. #include <iostream> #include <map> #include <queue> //无语的水题.节哀吧.且这道题不严谨,因为没说 ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...
- Heavy Transportation POJ 1797 最短路变形
Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...
- POJ 2253 Frogger -- 最短路变形
这题的坑点在POJ输出double不能用%.lf而要用%.f...真是神坑. 题意:给出一个无向图,求节点1到2之间的最大边的边权的最小值. 算法:Dijkstra 题目每次选择权值最小的边进行延伸访 ...
- poj 1797(最短路变形)
题目链接:http://poj.org/problem?id=1797 思路:题目意思很简单,n个顶点,m条路,每条路上都有最大载重限制,问1->n最大载重量.其实就是一最短路的变形,定义wei ...
- poj - 3268 Silver Cow Party (求给定两点之间的最短路)
http://poj.org/problem?id=3268 每头牛都要去标号为X的农场参加一个party,农场总共有N个(标号为1-n),总共有M单向路联通,每头牛参加完party之后需要返回自己的 ...
- POJ 1062 昂贵的聘礼详解最短路变形
POJ上难得一见的中文题…… 思路:建立一个以0为源点的地图,那么Map[0][n]的值代表 第n号物品的价值,Map[i][j]代表用 j 替代 i 后,物品j的价值.我们认为酋长的承诺为节点 ‘ ...
- poj 3013 最短路变形
http://poj.org/problem?id=3013 给出n个点,m个边.给出每个点的权值,每个边的权值.在m条边中选n-1条边使这n个点成为一棵树,root=1,求这棵树的最小费用,费用=树 ...
随机推荐
- java sevlet Session
* 如果浏览器支持Cookie,创建Session的时候会把SessionId保存在Cookie中 * 否则必须自己编程使用URL重写的方式实现Session:response.encodeURL()
- eclipse | 配置JRE
Window --> Preference --> Java ---> Installed JREs
- django_models表设计
和很多现代的web框架一样,django依赖于强大的数据访问层,试图将python面向对象特性和关系型数据库联系起来. 可移植性:不同的数据库,可以使用同一段代码,不用关心后台是哪家的数据库. 在一个 ...
- Markdown 简单使用教程
标题: # 一级标题 ## 二级标题 增加星号,字号相应变小,共有6级 列表: - 无序列表 编号. 有序列表 插入链接: [显示文本](链接地址) 插入图片:  引用: > ...
- vue项目node升级后,node-saas报错解决办法
ERROR in ./node_modules/_extract-text-webpack-plugin@3.0.2@extract-text-webpack-plugin/dist/loader.j ...
- Python Selenium设计模式 - PO设计模式
整理一下python selenium自动化测试实践中使用较多的po设计模式. 为什么要用PO 基于python selenium2开始开始ui自动化测试脚本的编写不是多么艰巨的任务.只需要定位到元素 ...
- 153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
假设一个按照升序排列的有序数组从某未知的位置旋转.(比如 0 1 2 4 5 6 7 可能变成 4 5 6 7 0 1 2).找到其中最小的元素.你可以假设数组中不存在重复的元素.详见:https:/ ...
- webkit滤镜
-webkit-filter: grayscale(1);/*灰度*/ -webkit-filter: sepia(1);/*褐色*/ -webkit-filter: saturate(1);/*饱和 ...
- Saltstack学习笔记--安装
实验环境: 两台RHEL 7.2 192.168.75.135 master .minion 192.168.75.136 minion 确保机器的防火墙及seli ...
- Centos 6.5安装MySQL-python
报错信息: Using cached MySQL-python-1.2.5.zip Complete output from command python setup.py egg_info: ...