HDU-6705 Path
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的更多相关文章
- HDU 6582 Path
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...
- HDU - 6582 Path (最短路+最小割)
题意:给定一个n个点m条边的有向图,每条边有个长度,可以花费等同于其长度的代价将其破坏掉,求最小的花费使得从1到n的最短路变长. 解法:先用dijkstra求出以1为源点的最短路,并建立最短路图(只保 ...
- [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 ...
- 2019CCPC网络赛
^&^ (HDU 6702) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- 2019CCPC网络预选赛 八道签到题题解
目录 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 6702 & 6703 array 6704 K-th occurrence 6705 path 6706 huntian o ...
- hdu 1973 Prime Path
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1973 Prime Path Description The ministers of the cabi ...
- hdu 1839 Delay Constrained Maximum Capacity Path 二分/最短路
Delay Constrained Maximum Capacity Path Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu. ...
- hdu 3631 Shortest Path(Floyd)
题目链接:pid=3631" style="font-size:18px">http://acm.hdu.edu.cn/showproblem.php?pid=36 ...
- HDU 5492(DP) Find a path
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意是有一个矩阵,从左上角走到右下角,每次能向右或者向下,把经过的数字记下来,找出一条路径是 ...
- [HDU 1973]--Prime Path(BFS,素数表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1973 Prime Path Time Limit: 5000/1000 MS (Java/Others ...
随机推荐
- Java中类和接口
很形象的接口的使用——针对初学者 里氏代换原则是什么?听起来很高深,不过我们也不是什么学院派,就不讲大道理了,直接拿个例子来说一下. 我们拿人和程序员举个例子.人是一个大类,程序员是继承自人的子类.看 ...
- 初涉Java
一.学习内容总结 1.程序入口 但如果类的定义使用了public class声明,那么文件名必须与类名保持一致,使用了class定义的类,文件名称可以和类名称不同. 2.输出语句 3.print与pr ...
- [Web 前端] 033 Vue 的简单使用
目录 0. 方便起见,定个轮廓 1. v-model 举例 2. v-for 举例 3. v-if 举例 4. 事件绑定 举例 5. v-show 举例 0. 方便起见,定个轮廓 不妨记下方的程序为 ...
- [Git] 021 来一颗“恶魔果实”?
0. 前言 需要新的功能时,一般会新建一条 "feature" 分支(尴尬的是,我第一眼看时,看成了 "future") 在 "feature&quo ...
- P-残缺的棋盘
Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, ...
- winform 窗体间传值
WinForm 两窗体之间传值实例 2010-12-27 22:10:11| 分类: 学业|举报|字号 订阅 下载LOFTER我的照片书 | 窗体Form1和Form2 Form2 ...
- Linux基础命令四
iptables iptables -F:关闭防火墙 crontab -l查看定时任务 crontab -e :编辑定时任务 log日志相关: ls /var/log:查看日志 du -sh /v ...
- jdk8中几个核心的函数式接口笔记
1. Function接口 /** * function 接口测试 * function 函数只能接受一个参数,要接受两个参数,得使用BiFunction接口 */ public class Func ...
- SpringMVC简单介绍及执行
SpringMVC介绍 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制器一 ...
- Postgresql重安装报错The database cluster initialisation failed.
之前安装过PostgreSQL-9.6.5,卸载后,重装PostgreSQL-9.1.3版本,报错. 清除注册表,删除postgres账户,清除垃圾后,再次安装仍然报错. 最后改变默认安装路径,神奇的 ...