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,求这棵树的最小费用,费用=树 ...
随机推荐
- Codeforces Round #418 (Div. 2) A
Description A few years ago, Hitagi encountered a giant crab, who stole the whole of her body weight ...
- linux常用的shell命令
1.shell介绍 shell(外壳)是linux系统的最外层,简单的说,它就是用户和操作系统之间的一个命令解释器. 2.shell命名的使用 ls :查看当前目录的信息,list . ...
- Objective-C和 C++ 混编的要点(转)
Using C++ With Objective-C苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++.有 ...
- JavaScript入门2
5.document对象:Document对象是window对象的一个对象属性,代表浏览器窗口中装载的整个HTML文档.文档中的每个HTML元素对应着JavaScript对象. 因为document代 ...
- 491 Increasing Subsequences 递增子序列
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2.示例:输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, ...
- ISCSI存储
slave-147作为服务端 需要安装的软件 [root@slave-147 ~]# yum install -y scsi-target-utils slave-148和slave-149作为客户端 ...
- (转)Unity优化之减少Drawcall
转载:http://www.jianshu.com/p/061e67308e5f Unity GUI(uGUI)使用心得与性能总结 背景和目的 小哈接触Unity3D也有一段时间了,项目组在UI解决方 ...
- Thymeleaf 总结
在javaScript中使用表达式 var list = /*[[${list}]]*/ null; <script th:inline="javascript"> ...
- idea DeBug调试学习
在Intellij IDEA中使用Debug 目录 一.Debug开篇 二.基本用法&快捷键 三.变量查看 四.计算表达式 五.智能步入 六.断点条件设置 七.多线程调试 八.回退断点 九.中 ...
- List<DTO>转 Map<String,List<DTO>> 两种写法
List<TeamScheduleDTO> list = JSON.parseArray(response.getData().getJSONArray("list") ...