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,求这棵树的最小费用,费用=树 ...
随机推荐
- UltraEdit的免费激活方法
本来前段时间用UE编辑器用的好好的,然后今天突然提示我使用到期,需要购买激活.一脸懵逼中,只好再次激活,谁知道按照原来的方法激活的时候一直提示您输入的许可证id或密码错误 请您检查注册邮件并且重试. ...
- C++11 多线程相关的头文件
C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable& ...
- css新奇技术及其未来发展
1.图像替换技术: 图像替换技术是指使用图像替换页面中文本的功能,类似与在页面中插入图像,只是这种方法更为方便,易于代码管理.通常来说,设计者习惯使用有意义的图像去替换一些标题,logo和某些特定的页 ...
- vue 模拟后台数据(加载本地json文件)调试
首先创建一个本地json文件,放在项目中如下 { "runRedLight":{ "CurrentPage": 1, "TotalPages" ...
- (一)Mybatis之初步接触
Maven的安装及环境配置 安装及配置只需按照以下三个链接的步骤走 撸帝的博客https://www.funtl.com/zh/maven/Maven-%E5%AE%89%E8%A3%85%E9%85 ...
- 【经验总结】VS2010下建立MFC程序
孙鑫的MFC教学视频非常不错,但是由于视频中孙鑫老师采用VC6.0版本,而现在 许多人都转向了使用VS,VS为我们生成了许多不需要的代码,这也导致在这节课的学习编程中总是遇到一些困难.那么,如何去掉这 ...
- 8.2.6 PEB —— PEB结构值不正确的问题
书中作者使用 dt _PEB xxxxxx 命令来查看当前进程的PEB结构. 实际操作后PEB结构显示的成员值: 作为进程链表的LDR结构居然没有值,这显然是不正常的,地址也没有输错,问题到底出在哪里 ...
- 程序员面试系列之Java单例模式的攻击与防御
我写的程序员面试系列 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Java ...
- Android系统级技巧合集
Android系统级技巧合集(随时更新) #转载请注明来源# 1.高通骁龙系列查看CPU体质等级 CPU体质,即为CPU在工作频率下的电压.同一批次的CPU体质各有不同,体质越高,代表该颗CPU可在更 ...
- input_shape { dim: 1 dim: 3 dim: 224 dim: 224 }
http://blog.csdn.net/u010417185/article/details/52619593