题目:

【题目描述】

跳跳虎在外面出去玩忘了时间,现在他需要在最短的时间内赶回家。

跳跳虎所在的世界可以抽象成一个含有 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≤10)

接下来 q 行每行 3 个整数 x,y,z ,表示有一条从 x 到 y ,时间花费为 z 的传送通道。( 1≤x,y≤n,1≤z≤10)

【输出格式】

输出一行一个整数表示最小时间消耗,如果没法回到家输出 -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)相关推荐

  1. tarjan+拓扑序+差分--2018.10.16模拟赛T2

    题目: 阿天住的城市有 n 个政府部门,这些部门之间用了 m 条有向路径 连接了起来.有趣的是,每过一天这些路径都会变换方向,也就是说, 偶数的日子和奇数的日子的图是不同的. 阿天在社保局工作,可惜他 ...

  2. 10.27模拟赛T2

    愚蠢的朴素dp比较好写,注意到唯一的瓶颈就在于状态太大,考虑离散 不能整除k的因子可以过滤掉,然后把因子放进map里面,reverse_iterator遍历一遍用朴素dp方程 dp[i][j]=dp[ ...

  3. 2018.10.9模拟赛

    2018.10.9模拟赛 T1 trade 正解:贪心 据说lyd讲过但并没有印象QAQ,考场上现推浪费了不少时间 其实就开个小根堆,每次把堆顶取出来看它是不是比当前的 a[i]a[i]a[i] 小, ...

  4. 2020/10/31模拟赛

    CSP第二轮前模拟赛 我太菜了 T1 题目描述 奶牛们对围栏的高度非常敏感.奶牛希望围栏高度既不太矮以至于他们没有安全感,也不太高以至于她们看不见围栏外的天地.所以每头奶牛都有自己喜欢的高度.奶牛有N ...

  5. 8月10日模拟赛题解

    前言 这次模拟赛应该是暑假以来最水的一场了,然而本来至少 210210210 的分数愣是被我弄成了 141141141,原因竟然是: const int MAXM = 5e5 + 5;struct e ...

  6. 2017.10.26模拟赛day1

    -- T1为爱追寻 问题描述 历经了半年的停课之后,紫萱学姐回到了陌生又熟悉的班里,她想找到学长的位置.于是她决定采用一种高效率的寻找方法:瞎找法. 我们将学姐的班级视为一个二维平面,每个整数坐标对应 ...

  7. 10.12NOIP模拟赛

    T1 过路费 Floyd 题目: 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都要 ...

  8. 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)

    洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{ ...

  9. 2018,10,19模拟赛

    jz的题...写炸了不少暴力...还有容斥等不太熟练 T1以为n^2*m过不去,想了好久 归根到底还是我太蒻了qwq 存一下代码 t1 为了稳一点写了部分分...还没删,可以自行跳过ovo #incl ...

最新文章

  1. Spring - Java/J2EE Application Framework 应用框架 第 15 章 EJB的存取和实现
  2. 2018 年,你可以把论文投给这 13 场 AI 学术会议(附截稿日期)
  3. 【渝粤教育】广东开放大学 行政管理 形成性考核 (35)
  4. CSS 中的内联元素、块级元素以及display的各个属性的特点
  5. 浅入浅出理解傅里叶变换
  6. 如何理解 Graph Convolutional Network(GCN)?
  7. [转载]C#实现软件自动更新思路
  8. python软件下载安装-【Python下载】Python安装 v3.8.1 官方版-七喜软件园
  9. java多线程阶乘_【java学习记录】11.用多线程实现阶乘的计算过程和结果的读取(thread类ReadThread )...
  10. EJB - 环境设置
  11. unity导入导出excel的功能
  12. 使用Tale搭建个人博客网站(基于java)
  13. 程序员、架构师、技术经理、技术总监、CTO,怎么定位?
  14. 商用密码应用安全性评估量化评估规则(2021版)
  15. Cobaltstrike系列教程(十一)提权与横向移动
  16. 【EtherCAT分析】三、EtherCAT从站设备描述文件设计
  17. 手机wps怎么设置打印横竖_手机WPS怎么设置横版打印?
  18. 【数字IC/FPGA】门控时钟
  19. 驾押人员安全教育培训系统隐私政策
  20. 揭秘橙子钱包拥有40万+用户的背后

热门文章

  1. 数字图像处理第二章----数字图像基础
  2. 立创EDA使用记录——使用技巧和问题记录
  3. Unity2019LTS版本终于来了
  4. 无符号数和有符号数的溢出判断
  5. js获取的当前时间的月份--getFullYear()、getMonth()、getDate(),本示例是获取当前月份的开始跟结束
  6. int GetMonth( ) const throw( );后面的throw( )什么意思?
  7. 华为 2016 校园招聘上机笔试题 题解
  8. 趣文:三分钟了解敏捷开发
  9. 辰迈智慧完美收官防灾减灾与应急救援展
  10. 淘宝天猫京东拼多多等平台关键词监控价格API接口(店铺商品价格监控API接口代码对接展示)