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,求这棵树的最小费用,费用=树 ...
随机推荐
- Jmeter之添加响应断言,bean shell post processor
一直在想运用jmeter来实现接口自动化测试,但是每次每个接口执行完,需要肉眼去看一看,执行的结果对不对,总结了两种办法, 一.将每个请求的响应结果,导出到文件 选中请求右键-->添加后置处理器 ...
- 【模板】c++动态数组vector
相信大家都知道$C$++里有一个流弊的$STL$模板库.. 今天我们就要谈一谈这里面的一个容器:动态数组$vector$. $vector$实际上类似于$a[]$这个东西,也就是说它重载了$[]$运算 ...
- Codeforces Round #410 (Div. 2) C
Description Mike has a sequence A = [a1, a2, ..., an] of length n. He considers the sequence B = [b1 ...
- Eclipse的ant调用maven
需要在 eclipse 的 windows - preferences - ant - runtime - classpath - global entries 加入 eclipse 里面的 jsch ...
- Spring------自动化装配Bean(一)
一.创建 CompactDisc接口和SgetPeppers实现类 CompactDisc接口方法为播放.SgtPeppers实现CompactDisc接口. package soundsystem; ...
- [转]C#综合揭秘——细说多线程(上)
引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程 ...
- spring mvc 通过拦截器记录请求数据和响应数据
spring mvc 能过拦截器记录请求数据记录有很多种方式,主要有以下三种: 1:过滤器 2:HandlerInterceptor拦截器 3:Aspect接口控制器 但是就我个人所知要记录返回的数据 ...
- poj3436 Computer Factory
题意: 电脑公司生产电脑有N个机器,每个机器单位时间产量为Qi. 电脑由P个部件组成,每个机器工作时只能把有某些部件的半成品电脑(或什么都没有的空电脑)变成有另一些部件的半成品电脑或完整电脑(也可能移 ...
- IOStableviewsectionSet
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { if (t ...
- qt project settings被禁用解决方案
转载请注明出处:http://www.cnblogs.com/dachen408/p/7422707.html qt project settings被禁用点击不了: 解决方案:需要点击该项目(或者项 ...