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,求这棵树的最小费用,费用=树 ...
随机推荐
- Centos 6.x 搭建 Zabbix Server
zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让 ...
- 题解报告:hdu 6440 Dream(费马小定理+构造)
解题思路:给定素数p,定义p内封闭的加法和乘法运算(运算封闭的定义:若从某个非空数集中任选两个元素(同一元素可重复选出),选出的这两个元素通过某种(或几种)运算后的得数仍是该数集中的元素,那么,就说该 ...
- 题解报告:hihoCoder #1050 : 树中的最长路
描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已. 但 ...
- 关于BMP
关于BMP位图的资料网上有很多,内容也比较基础.本文实现BMP位图的读取.显示.保存,并对一些重要的问题进行说明(包括字节对齐.内存中的存储顺序.调色板). BMP文件共包括文件头.信息头.调色板(位 ...
- webkit滤镜
-webkit-filter: grayscale(1);/*灰度*/ -webkit-filter: sepia(1);/*褐色*/ -webkit-filter: saturate(1);/*饱和 ...
- Django 开发blog未完待续
[root@sishen simpleblog]# python3.5 Python 3.5.4 (default, Sep 20 2017, 20:37:45) [GCC 4.4.7 2012031 ...
- 使用json传输数组实例
client.php <?php //遍历数组元素,并将元素转码 function array_iconv($data, $in_charset='GBK', $out_charset='UTF ...
- ubuntu用户自定义的命令alias永久生效
cd ~ vi .bash_profile alias ll='ls -ltr' . .bash_profile ps:写在.bashrc终端断开就没了
- checkbox:click事件触发span元素内容改变
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- VS Code使用技巧整理
转自:https://blog.csdn.net/u011127019/article/details/58586129 https://blog.csdn.net/sgdd123/article/d ...