题目:

【题目描述】

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

跳跳虎所在的世界可以抽象成一个含有 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=;
int d[maxn][maxn<<];
struct hh
{
int nex,to,dis,bo;//bo用来判断这条边是否是
}t[maxn<<];
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=,xs=;
char ls;
ls=getchar();
while(!isdigit(ls))
{
if(!(ls^))
kr=-;
ls=getchar();
}
while(isdigit(ls))
{
xs=(xs<<)+(xs<<)+(ls^);
ls=getchar();
}
return xs*kr;
}
inline void dijkstra()//dijkstra 最短路的双层图模板(和普通最短路模板基本一样)
{
q.push((pd){,,});
d[][]=;
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=;i<=m;i++)
{
x=read();y=read();z=read();
add(x,y,z,);//存普通的路
}
for(int i=;i<=Q;i++)
{
x=read();y=read();z=read();
add(x,y,z,);//存传送通道
}
memset(d,INF,sizeof(d));
dijkstra();
int ans=INF;
for(int i=;i<=min(Q,k);i++)
ans=min(ans,d[n][i]);
if(ans==INF)//判断是否有路
{
printf("-1\n");return ;
}
printf("%d\n",ans);
return ;
}

跳跳虎回家(国庆10.1模拟赛T2)的更多相关文章

  1. [10.18模拟赛] 序列 (DP)

    [10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...

  2. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  3. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  4. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

  5. 2018.10.17NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...

  6. 201800624模拟赛T2——回家路上

    题目描述 很多学生都抱怨浪费在回家路上的时间太长.这天dongdong刚走出学校大门,就听说某段路在施工(但不知道是哪条路),有可能导致他回家的时间会变长. Dongdong给出了一张地图,图中标号为 ...

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

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

  8. 2018.10.23NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 50 + (10 \sim 50)\) 实际得分:\(100 + 10 + 50\) 这可能是我打的最懵逼的一场考试没有之一.. T1两个小时才做出来也是醉了. T ...

  9. 17.2.10 NOIP模拟赛 聪哥的工资

    聪哥的工资 (money/money.in/money.out) 时限1000ms 内存256MB 题目描述 lwher: 了体验劳苦大众的生活,聪哥在暑假参加了打零工的活动,这个活动分为n个工作日, ...

随机推荐

  1. Codeforces 841B - Godsend

    题目链接:http://codeforces.com/problemset/problem/841/B Leha somehow found an array consisting of n inte ...

  2. C++11 正则表达式简单运用

    正则表达式(regular expression)是计算机科学中的一个概念,又称规则表达式,通常简写为regex.regexp.RE.regexps.regexes.regexen. 正则表达式是一种 ...

  3. The address where a.out.debug has been loaded is missing以及No symbol "*" in current context原因与解决方法

    最近,在debug core的时候,发现p 变量的时候提示“No symbol "*" in current context”,我们的代码使用-g编译的,经查有可能是下列几个原因或 ...

  4. centos6下jbd2进程占用大量IO处理

    刚在尝试重现一个bug时,好像在killed mysql一段时间之后,io一直很高,如下: 12:40:01 PM CPU %user %nice %system %iowait %steal %id ...

  5. Ubuntu 部署 nginx

    Ubuntu 部署 nginx  apt-get install nginx

  6. Java Web-----JSP与Servlet(一)

    JSP (java服务器页面) JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1]  是由Sun Microsystems公司倡 ...

  7. 20145308 《网络对抗》 MSF基础应用 学习总结

    20145308 <网络对抗> MSF基础应用 学习总结 实验内容 掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路.具体需要完成(1)一个主动攻击,如ms08_067 ...

  8. JavaScript事件监听以及addEventListener参数分析

    事件监听 在Javascript中事件的监听是用来对某些操作做出反应的方法.例如监听一个按钮的pressdown, 或者获取鼠标左键按下时候鼠标的位置.这些都需要使用监听来完成.监听的函数很简单:ad ...

  9. Python3基础 dict 推导式 生成10以内+奇数的值为True 偶数为False的字典

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. ZOJ 3593 One Person Game(ExGcd + 最优解)题解

    思路:题意转化为求 (ax+by=dis) || (ax+cy=dis) || (bx+cy=dis) 三个式子有解时的最小|x| + |y|.显然求解特解x,y直接用扩展欧几里得,那么怎么求|x| ...