SGU---103 最短路变形
题目链接:
https://cn.vjudge.net/problem/SGU-103#author=ECUST_FZL
题目大意:
Dingiville 城市的交通规则非常奇怪,城市公路通过路口相连,两个不同路口之间最多只有一条直达公路。公路的起止点不会是同一路口。在任意一条公路上顺不同方向走所需 时间相同。每一个路口都有交通灯,这些交通灯在某一时刻要么是蓝色,要么是紫色。同一个灯上2个颜色的维持时间受到定期调控,总是蓝色持续一段时间,紫色 持续一段时间。交通规则规定两个路口可以通车仅当公路两边交通灯的颜色相同(也就是说只要你在A城市看见A与B的交通灯颜色相同,那么你就可以走上A-B 这条路并到达B点)。交通工具可以在路口等候。现在你有这个城市的地图,包含:
• 通过所有公路需要的时间(整数)
• 每个路口交通灯两种颜色的持续时间(整数)
• 每个路口交通灯的初始颜色以及初始颜色的持续时间(整数).
你的任务是找到一条从起点到终点的最快路径,当有多条这样的路径存在时,你只需输出任意一条即可。
解题思路:
可以用SPFA求解最短路,只是松弛的时候,计算两点的路径的时候需要计算一下。
只有u点的颜色和v点的颜色是一致的时候才可以从u到v,可以写出一个函数计算某时刻某个点的颜色,对于u v路径,可以枚举在dis[u] - dis[u] + 300内的所有时间直到两点颜色相同。这是由于周期最多为200,在一个半周期内没有解的话就无解了。

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ;
struct Edge
{
int u, v, w;
Edge(){}
Edge(int u, int v, int w):u(u), v(v), w(w){}
};
vector<Edge>edges;//存每一条边
vector<int>Map[maxn];//存i相连的边的下标
void addedge(int u, int v, int w)
{
edges.push_back(Edge(u, v, w));
int m = edges.size();
Map[u].push_back(m - );
edges.push_back(Edge(v, u, w));
m = edges.size();
Map[v].push_back(m - );
} struct node
{
bool color;//color = 0为blue color = 1为purple
int init, tb, tp, tsum;
}a[maxn]; int color(int u, int time)//计算time时候 u点的颜色
{
time = (time - a[u].init + a[u].tsum) % a[u].tsum;
if(a[u].color)return time < a[u].tb ? : ;//最初为紫色的时候
else return time < a[u].tp ? : ;//最初为蓝色的时候
}
int Time(int u, int v, int now)//返回从u到v可以开始走的时间
{
for(int i = now; i <= now + ; i++)
if(color(u, i) == color(v, i))return i;
return INF;
} bool vis[maxn];
int d[maxn], path[maxn];
int n, m;
int SPFA(int s, int t)
{
memset(vis, , sizeof(vis));
memset(path, -, sizeof(path));
for(int i = ; i <= n; i++)d[i] = INF;
d[s] = ;
vis[s] = ;
queue<int>q;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = ;
for(int i = ; i < Map[u].size(); i++)
{
Edge& e = edges[Map[u][i]];
int v = e.v;
int w = Time(u, v, d[u]) + e.w;//这是u到v的时间
if(d[v] > w)
{
d[v] = w;
path[v] = Map[u][i];
if(!vis[v])
{
q.push(v);
vis[v] = ;
}
} }
}
return d[t];
}
void Print(int s, int t)
{
stack<int>q;
int x = t;
while(path[x] != -)
{
q.push(x);
x = edges[path[x]].u;
}
printf("%d", s);
while(!q.empty())
{
printf(" %d", q.top());
q.pop();
}
puts("");
}
int main()
{
int s, t;
char c[];
scanf("%d%d", &s, &t);
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++)
{
scanf("%s%d%d%d", c, &a[i].init, &a[i].tb, &a[i].tp);
a[i].tsum = a[i].tb + a[i].tp;
a[i].color = c[] == 'P';
}
int u, v, w;
while(m--)
{
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w);
}
int ans = SPFA(s, t);
if(ans >= INF)
{
printf("0\n");
}
else
{
printf("%d\n", ans);
Print(s, t);
}
return ;
}
SGU---103 最短路变形的更多相关文章
- POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)
做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑...... 本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离, ...
- 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 ...
- POJ-1797Heavy Transportation,最短路变形,用dijkstra稍加修改就可以了;
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Description Background Hugo ...
- HDOJ find the safest road 1596【最短路变形】
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HN0I2000最优乘车 (最短路变形)
HN0I2000最优乘车 (最短路变形) 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! [试题]为了简化城市公共汽车收费系 ...
- 天梯杯 PAT L2-001. 紧急救援 最短路变形
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
- Heavy Transportation POJ 1797 最短路变形
Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...
- POJ 2253 Frogger ( 最短路变形 || 最小生成树 )
题意 : 给出二维平面上 N 个点,前两个点为起点和终点,问你从起点到终点的所有路径中拥有最短两点间距是多少. 分析 : ① 考虑最小生成树中 Kruskal 算法,在建树的过程中贪心的从最小的边一个 ...
- 最短路变形题目 HDU多校7
Mr.Quin love fishes so much and Mr.Quin’s city has a nautical system,consisiting of N ports and M sh ...
随机推荐
- Angular CLI 安装和使用以及安装失败的解决方法
背景介绍 关于Angular版本,Angular官方已经统一命名Angular 1.x同一为Angular JS:Angular 2.x及以上统称Angular: CLI是Command Line I ...
- 如何使用 Telegram
Telegram是一款加密的实时通讯软件,本文告诉大家如何使用 这个软件. 在使用之前,需要保证自己已经开了梯子,如果没有梯子,那么就无法使用这个工具. 假如梯子是 127.0.0.1 端口 1080 ...
- CALayer及其子类
前言:这个系列要更新Core Animation的内容,但是CALayer是Core Animation的基础. 一 CALayer是什么? 摘自官网的一句话-Layers Provide the B ...
- 从mysql中dump数据到本地
方法一:使用mysqldump命令,如: mysqldump -h10.90.6.237 -uf_insplat2car_r -P3306 -pxxxxxxxxx nbmp tb_tag_log -- ...
- 高并发第八弹:J.U.C起航(java.util.concurrent)
java.util.concurrent是JDK自带的一个并发的包主要分为以下5部分: 并发工具类(tools) 显示锁(locks) 原子变量类(aotmic) 并发集合(collections) ...
- SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器
一.参数的传递 1.简单的参数传递 /* @RequestParam用法:入参名字与方法名参数名不一致时使用{ * value:传入的参数名,required:是否必填,defaultValue:默认 ...
- Python 两个list合并成一个字典
方法一:list1 = ['k1','k2','k3'] list2 = ['v1','v2','v3'] dic = dict(map(lambda x,y:[x,y],list1,list2)) ...
- html5备忘录——张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1544 一.前言兼图片 ...
- THUSC2017 游记
你若安好,便是晴天. Day 0 中午就要出发了,上午浮躁的不行,根本写不下题去. 到了火车站之后发现教练和lyc和ztc在4车靠近5车的那一边,然而我在5车靠近4车的那边,尴尬…… 本来是想着上了火 ...
- BZOJ4337: BJOI2015 树的同构(hash 树同构)
题意 题目链接 Sol 树的同构问题,直接拿hash判一下,具体流程大概是这样的: 首先转化为有根树,预处理出第\(i\)棵树以\(j\)为根时的hash值. 那么两个树同构当且仅当把两棵树的hash ...