跳跳虎回家(国庆10.1模拟赛T2)
题目:
【题目描述】
跳跳虎在外面出去玩忘了时间,现在他需要在最短的时间内赶回家。
跳跳虎所在的世界可以抽象成一个含有 n 个点的图(点编号从 1 到 n ),跳跳虎现在在 1 号点,跳跳虎的家在 n 号点。
图上一共有 m 条单向边,通过每条边有固定的时间花费。
同时,还存在若干个单向传送通道,传送通道也有其时间花费。
传送通道一般来说比普通的道路更快,但是跳跳虎最多只能使用 k 次。
跳跳虎想知道他回到家的最小时间消耗是多少。
【输入格式】
第一行输入 4 个整数 n,m,q,k 。( n 表示点数,m 表示普通道路的数量,q 表示传送通道的数量,k 表示跳跳虎最多使用 k 次传送通道)
接下来 m 行每行 3 个整数 u,v,w ,表示有一条从 u 到 v ,时间花费为 w 的普通道路。( 1≤u,v≤n,1≤w≤103 )
接下来 q 行每行 3 个整数 x,y,z ,表示有一条从 x 到 y ,时间花费为 z 的传送通道。( 1≤x,y≤n,1≤z≤103 )
【输出格式】
输出一行一个整数表示最小时间消耗,如果没法回到家输出 -1 。
【样例输入】
5 5 2 1
1 2 1
1 3 2
2 4 2
3 4 3
4 5 4
1 4 1
2 5 1
【样例输出】
2
【数据规模与约定】
对于30%的数据,1≤n≤500, 0≤m,q≤2000,k=0;
对于另外30%的数据,1≤n≤500,0≤m,q≤2000,k=1;
对于100%的数据,1≤n≤500,0≤m,q≤2000,0≤k≤109。
思路:
分层建图,定义 dis [ u ][ k ] 表示到结点 u ,共经过 k 条第二类边的最短路。
显然我们可以以 k 为阶段划分状态,然后就划分成了最短路的子问题。
dis [ u ][ k ] 可以转移到 dis [ v ][ k ](第一类边)和 dis [ v ][ k+1 ](第二类边)。
然后就可以用 dijkstar 求最短路 求出答案。
标程:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<cstdlib> #include<stack> #include<vector> #include<queue> #include<deque> #include<map> #include<set> using namespace std; #define maxn 1001 #define INF 0x3f3f3f3f int n,m,Q,k; int head[maxn],cnt=0; int d[maxn][maxn<<1]; struct hh {int nex,to,dis,bo;//bo用来判断这条边是否是 }t[maxn<<2]; struct pd//重载(做优先队列用) {int u,num,v;//u起始点,num表示这条边之前已经走过了几条传送边 ,v表示 bool operator < (const pd &a)const{return v>a.v;} }; priority_queue<pd> q; inline void add(int nex,int to,int dis,int bo) {t[++cnt].nex=head[nex];t[cnt].to=to;t[cnt].dis=dis;t[cnt].bo=bo;//bo为 0 表示普通的路,为 1 表示传送通道head[nex]=cnt; } inline int read() {int kr=1,xs=0;char ls;ls=getchar();while(!isdigit(ls)){if(!(ls^45))kr=-1;ls=getchar();}while(isdigit(ls)){xs=(xs<<1)+(xs<<3)+(ls^48);ls=getchar();}return xs*kr; } inline void dijkstra()//dijkstra 最短路的双层图模板(和普通最短路模板基本一样) {q.push((pd){1,0,0});d[1][0]=0;while(!q.empty()){pd x=q.top();q.pop();if(x.v!=d[x.u][x.num]) continue;for(int i=head[x.u];i;i=t[i].nex){int v=t[i].to;if(d[v][x.num+t[i].bo]>x.v+t[i].dis)//最短路 {d[v][x.num+t[i].bo]=x.v+t[i].dis;q.push((pd){v,x.num+t[i].bo,d[v][x.num+t[i].bo]});//存:边权,已走过的传送道路数,距点1 的距离 }}} } int main() {freopen("move.in","r",stdin);freopen("move.out","w",stdout);n=read();m=read();Q=read();k=read();int x,y,z;for(int i=1;i<=m;i++){x=read();y=read();z=read();add(x,y,z,0);//存普通的路 } for(int i=1;i<=Q;i++){x=read();y=read();z=read();add(x,y,z,1);//存传送通道 }memset(d,INF,sizeof(d));dijkstra();int ans=INF;for(int i=0;i<=min(Q,k);i++)ans=min(ans,d[n][i]);if(ans==INF)//判断是否有路 {printf("-1\n");return 0;}printf("%d\n",ans); return 0; }
转载于:https://www.cnblogs.com/lck-lck/p/9737675.html
跳跳虎回家(国庆10.1模拟赛T2)相关推荐
- tarjan+拓扑序+差分--2018.10.16模拟赛T2
题目: 阿天住的城市有 n 个政府部门,这些部门之间用了 m 条有向路径 连接了起来.有趣的是,每过一天这些路径都会变换方向,也就是说, 偶数的日子和奇数的日子的图是不同的. 阿天在社保局工作,可惜他 ...
- 10.27模拟赛T2
愚蠢的朴素dp比较好写,注意到唯一的瓶颈就在于状态太大,考虑离散 不能整除k的因子可以过滤掉,然后把因子放进map里面,reverse_iterator遍历一遍用朴素dp方程 dp[i][j]=dp[ ...
- 2018.10.9模拟赛
2018.10.9模拟赛 T1 trade 正解:贪心 据说lyd讲过但并没有印象QAQ,考场上现推浪费了不少时间 其实就开个小根堆,每次把堆顶取出来看它是不是比当前的 a[i]a[i]a[i] 小, ...
- 2020/10/31模拟赛
CSP第二轮前模拟赛 我太菜了 T1 题目描述 奶牛们对围栏的高度非常敏感.奶牛希望围栏高度既不太矮以至于他们没有安全感,也不太高以至于她们看不见围栏外的天地.所以每头奶牛都有自己喜欢的高度.奶牛有N ...
- 8月10日模拟赛题解
前言 这次模拟赛应该是暑假以来最水的一场了,然而本来至少 210210210 的分数愣是被我弄成了 141141141,原因竟然是: const int MAXM = 5e5 + 5;struct e ...
- 2017.10.26模拟赛day1
-- T1为爱追寻 问题描述 历经了半年的停课之后,紫萱学姐回到了陌生又熟悉的班里,她想找到学长的位置.于是她决定采用一种高效率的寻找方法:瞎找法. 我们将学姐的班级视为一个二维平面,每个整数坐标对应 ...
- 10.12NOIP模拟赛
T1 过路费 Floyd 题目: 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都要 ...
- 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)
洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{ ...
- 2018,10,19模拟赛
jz的题...写炸了不少暴力...还有容斥等不太熟练 T1以为n^2*m过不去,想了好久 归根到底还是我太蒻了qwq 存一下代码 t1 为了稳一点写了部分分...还没删,可以自行跳过ovo #incl ...
最新文章
- Spring - Java/J2EE Application Framework 应用框架 第 15 章 EJB的存取和实现
- 2018 年,你可以把论文投给这 13 场 AI 学术会议(附截稿日期)
- 【渝粤教育】广东开放大学 行政管理 形成性考核 (35)
- CSS 中的内联元素、块级元素以及display的各个属性的特点
- 浅入浅出理解傅里叶变换
- 如何理解 Graph Convolutional Network(GCN)?
- [转载]C#实现软件自动更新思路
- python软件下载安装-【Python下载】Python安装 v3.8.1 官方版-七喜软件园
- java多线程阶乘_【java学习记录】11.用多线程实现阶乘的计算过程和结果的读取(thread类ReadThread )...
- EJB - 环境设置
- unity导入导出excel的功能
- 使用Tale搭建个人博客网站(基于java)
- 程序员、架构师、技术经理、技术总监、CTO,怎么定位?
- 商用密码应用安全性评估量化评估规则(2021版)
- Cobaltstrike系列教程(十一)提权与横向移动
- 【EtherCAT分析】三、EtherCAT从站设备描述文件设计
- 手机wps怎么设置打印横竖_手机WPS怎么设置横版打印?
- 【数字IC/FPGA】门控时钟
- 驾押人员安全教育培训系统隐私政策
- 揭秘橙子钱包拥有40万+用户的背后
热门文章
- 数字图像处理第二章----数字图像基础
- 立创EDA使用记录——使用技巧和问题记录
- Unity2019LTS版本终于来了
- 无符号数和有符号数的溢出判断
- js获取的当前时间的月份--getFullYear()、getMonth()、getDate(),本示例是获取当前月份的开始跟结束
- int GetMonth( ) const throw( );后面的throw( )什么意思?
- 华为 2016 校园招聘上机笔试题 题解
- 趣文:三分钟了解敏捷开发
- 辰迈智慧完美收官防灾减灾与应急救援展
- 淘宝天猫京东拼多多等平台关键词监控价格API接口(店铺商品价格监控API接口代码对接展示)