Description

You have a directed weighted graph with n vertexes and m edges. The value of a path is the sum of the weight of the edges you passed. Note that you can pass any edge any times and every time you pass it you will gain the weight.

Now there are q queries that you need to answer. Each of the queries is about the k-th minimum value of all the paths.

Input

The input consists of multiple test cases, starting with an integer t (1≤t≤100), denoting the number of the test cases.

The first line of each test case contains three positive integers n,m,q. (\(1≤n,m,q≤5∗10^4\))

Each of the next m lines contains three integers ui,vi,wi, indicating that the i−th edge is from ui to vi and weighted wi.(1≤ui,vi≤n,1≤wi≤109)

Each of the next q lines contains one integer k as mentioned above.(\(1≤k≤5∗10^4\))

It's guaranteed that \(Σn ,Σm, Σq,Σmax(k)≤2.5∗10^5\) and max(k) won't exceed the number of paths in the graph.

Output

For each query, print one integer indicates the answer in line.

Sample Input

1
2 2 2
1 2 1
2 1 2
3
4

Sample Output

3
3

题解

给定一张有向图,q次询问,每次询问第k小的路径长度。

离线,预处理出最大的k范围内的所有路径长度。先将所有边按边权排序,用一个set存储当前可以成为答案的边,且set的最大的大小为maxk,每次从set中取出w最小的边,看看能否更新set中的元素,不能更新则break(边权从小到大排序,小边权无法更新之后边权也无法更新),对set中的元素都做一次这样的处理后,我们就得到了[1,maxk]的答案,输出询问即可,复杂度\(O(k*log(m+k))\)

AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e4 + 50;
struct node {
int v; ll w;
node (int v = 0, int w = 0): v(v), w(w) {}
bool operator < (const node &b) const {
return w < b.w;
}
};
vector<node> G[N];
struct Edge {
int u, v; ll w;
int id;
Edge(int u = 0, int v = 0, ll w = 0, int id = 0): u(u), v(v), w(w), id(id) {}
bool operator < (const Edge &b) const {
if (w == b.w)
if (u == b.u)
if (v == b.v)
return id < b.id;
else return v < b.v;
else return u < b.u;
else return w < b.w;
}
bool operator == (const Edge &b) const {
return w == b.w && u == b.u && v == b.v && id == b.id;
}
};
int Q[N];
ll ans[N];
int main() {
int t; scanf("%d", &t);
while (t--) {
int n, m, q;
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= n; i++) G[i].clear();
set<Edge> st; st.clear();
int cnt = 0;
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
G[u].push_back(node(v, w));
st.insert(Edge(u, v, w, ++cnt));
}
for (int i = 1; i <= n; i++) sort(G[i].begin(), G[i].end());
int maxk = 0;
for (int i = 1; i <= q; i++) {
scanf("%d", &Q[i]);
maxk = max(maxk, Q[i]);
}
while (st.size() > maxk) st.erase(st.end());
for (int i = 1; i <= maxk; i++) {
Edge now = *st.begin();
st.erase(st.begin());
ans[i] = now.w;
if (i == maxk) break;
int u = now.v;
for (int j = 0; j < G[u].size(); j++) {
int v = G[u][j].v;
ll w = G[u][j].w;
if (i + st.size() < maxk) st.insert(Edge(now.u, v, now.w + w, ++cnt));
else {
set<Edge>::iterator it = st.end(); it--;
Edge last = *it;
if (now.w + w < last.w) {
st.erase(it);
st.insert(Edge(u, v, now.w + w, ++cnt));
}
else break;
}
}
}
for (int i = 1; i <= q; i++) printf("%lld\n", ans[Q[i]]);
}
return 0;
}

HDU-6705 Path的更多相关文章

  1. HDU 6582 Path

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  2. HDU - 6582 Path (最短路+最小割)

    题意:给定一个n个点m条边的有向图,每条边有个长度,可以花费等同于其长度的代价将其破坏掉,求最小的花费使得从1到n的最短路变长. 解法:先用dijkstra求出以1为源点的最短路,并建立最短路图(只保 ...

  3. [BFS,A*,k短路径] 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 path (Problem - 6705)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6705 path Time Limit: 2000/2000 MS (Java/Others)    Mem ...

  4. 2019CCPC网络赛

    ^&^ (HDU 6702) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  5. 2019CCPC网络预选赛 八道签到题题解

    目录 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 6702 & 6703 array 6704 K-th occurrence 6705 path 6706 huntian o ...

  6. hdu 1973 Prime Path

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1973 Prime Path Description The ministers of the cabi ...

  7. hdu 1839 Delay Constrained Maximum Capacity Path 二分/最短路

    Delay Constrained Maximum Capacity Path Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu. ...

  8. hdu 3631 Shortest Path(Floyd)

    题目链接:pid=3631" style="font-size:18px">http://acm.hdu.edu.cn/showproblem.php?pid=36 ...

  9. HDU 5492(DP) Find a path

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意是有一个矩阵,从左上角走到右下角,每次能向右或者向下,把经过的数字记下来,找出一条路径是 ...

  10. [HDU 1973]--Prime Path(BFS,素数表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1973 Prime Path Time Limit: 5000/1000 MS (Java/Others ...

随机推荐

  1. cocos2dx基础篇(10) 按钮控件CCControlButton

    [3.x] (1)去掉 “CC” (2)对象类 CCObject 改为 Ref (3)按钮事件回调依旧为 cccontrol_selector ,没有使用 CC_CALLBACK_2 (4)按钮状态  ...

  2. jyputer notebook 、jypyter、IPython basics

    1 .修改jupyter默认工作目录:打开cmd,在命令行下指定想要进的工作目录,即键入“cd d/  G:\0工作面试\学习记录”标红部分是想要进入的工作目录. 2.Tab补全 a.在命令行输入表达 ...

  3. 解决172.17 或者172.18 机房环境下harbor服务器不通的问题

    直接改docker-compose.yml文件: 把原来的network选项注释掉,自定义 #networks: # harbor: # external: false networks: harbo ...

  4. 使用itchat完成微信自动回复

    import itchat from itchat.content import * # 微信自动回复 @itchat.msg_register([TEXT]) def text_reply(msg) ...

  5. Redis-集群操作

    一.查看集群状态 1.查看集群状态 /opt/redis/src/redis-cli -h 本机IP -p redsi实例端口 -c #连接redis实例 /opt/redis/src/redis-c ...

  6. 软技能-代码外的生存指南PDF下载

    编程只是我们职业生涯中的一部分,我们还需要更多的其他技能 链接:https://pan.baidu.com/s/1d7z_7NCEFT2lsSWO1n-OuA 提取码:zj32 链接失效请留言

  7. java学习day1

    一.常用的DOS命令 1.打开cmd 窗口键+r --> 输入cmd --> 确认 2.常用的dos命令 dir:列出当前目录下的所有文件及文件夹 md:创建一个新的目录 rd:删除目录 ...

  8. 最小生成树: HDU1233还是畅通工程

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  9. antd组件Upload实现自己上传

    前言 在实现图片上传时,可能需要用到Upload,但是它默认的上传方式是加入图片后直接上传,如果要实现最后再一次性上传,需要自定义内容. //添加按钮的样式 const uploadButton = ...

  10. 各类无次数限制的免费API接口,再也不怕找不到免费API了

    各类无次数限制的免费API接口整理,主要是聚合数据上和API Store上的一些,还有一些其他的. 聚合数据提供30大类,160种以上基础数据API服务,国内最大的基础数据API服务,下面就罗列一些免 ...