简单图上操作
题号:NC200087
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给一个n个站点m条边的无向图,每条边有边权,cat想出去玩,给出cat出发的起点s和旅行的终点t,cat背了一个容量为v的书包装有零食补充体力,如果有一条边距离超过v那么cat不能走这条边,因为他会体力不支走不动,每到一个站点cat都能买零食把书包重新填满,此外,cat还有k张万能车票,如果一条边距离超过v,它能使用一张车票坐车经过这条边,但是cat很懒不想背太重的书包,现在你来告诉它v最小可以设多少使得cat能顺利到达终点

输入描述:

第一行输入三个数n,m,k(1 <= n <=2e5,n - 1 <= m, k <= 4e5)

第二行输入两个数s,t,表示起点和终点(1 <= s, t <= n)

接下来m行输入三个数u, v, w代表u与v连接有一条距离为w的边(1 <= u, v <= n,1 <= w <= 1e9)

输出描述:

输出一个数表示答案
示例1

输入

复制
5 4 2 
1 5
1 2 1
2 3 2
3 4 3
4 5 2

输出

复制
2

说明

提示:数据量较大,dfs小心爆栈,推荐链向星建图

链向星建图用法:

加边:

void add(int u, int v, int w) // u 连接一条边到 v,权值为w

{

Next[++cnt] = Laxt[u];

Laxt[u] = cnt;

To[cnt] = v;

Len[cnt] = w;

}

清空:

void init()

{

for (int i = 1; i <= n; i++)

Laxt[i] = 0;

cnt = 0;

}

遍历:

for (int i = Laxt[u]; i; i = Next[i])

{

int v = To[i];

int w = Len[i];

/*

*/

}

备注:

保证图联通无重边