2019CCPC网络赛 HDU6705 - path K短路
题意:给出n个点m条边的有向图,问图上第K短路的长度是多少(这里的路可以经过任何重复点重复边)。
解法:解法参考https://blog.csdn.net/Ratina/article/details/100066384这位大佬的。
比赛的时候也能想到用类似Dijkstra的做法用优先队列一条一条路拓展出来但是这样会MLE也没想到解决办法。后来看了题解才学会这个比较巧妙的优化办法。
朴素的办法就是向堆优化的Dijkstra一样把(u,dist)存入优先队列里然后每次从队列中找一个最小的dist出来拓展其他边,第k次出队的就是第k短路,直至找到答案。这种办法会获得MLE。因为每次取出来拓展的边实在是太多了,空间根本存不下。你可能会想到其实优先队列最多存K个状态就好了多余的直接踢掉,那么可以用Set来实现这个只存K个状态的功能,但是遗憾的是这样会获得TLE。
正确的解法是先对全部点的出边按长度从小到大排序,减少每次取出来后拓展的状态,优先队列里存(u,v,cur,dist)状态,代表从u走到v走的是u第cur条出边且到v点的路径长度是dist。那么这个状态只拓展出两种状态,①u走第cur+1条出边到达新的v,②是v继续往下走但是只走v的第一条出边。显然这两种情况是紧接着取出来的状态的且数量变得更少。于是此题获得AC。
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+;
typedef long long LL;
int n,m,l,Max,qu[N];
LL ans[N];
struct edge{
int x,y,z;
bool operator < (const edge &rhs) const {
return z<rhs.z;
}
};
vector<edge> G[N]; struct dat{
LL u,v,cur,dis;
bool operator < (const dat &rhs) const {
return dis>rhs.dis;
}
}; priority_queue<dat> q;
void Dijkstra() {
while (!q.empty()) q.pop();
for (int i=;i<=n;i++)
if (G[i].size()) q.push((dat){G[i][].x,G[i][].y,,G[i][].z});
int num=;
while (!q.empty()) {
dat x=q.top(); q.pop();
ans[++num]=x.dis;
if (num>=Max) break;
if (x.cur+<G[x.u].size())
q.push((dat){x.u,G[x.u][x.cur+].y,x.cur+,x.dis+G[x.u][x.cur+].z-G[x.u][x.cur].z});
for (int i=;i<G[x.v].size();i++) {
edge e=G[x.v][i];
q.push((dat){x.v,e.y,,x.dis+e.z});
break;
}
}
} int main()
{
int T; cin>>T;
while (T--) {
scanf("%d%d%d",&n,&m,&l);
for (int i=;i<=n;i++) G[i].clear();
for (int i=;i<=m;i++) {
int x,y,z; scanf("%d%d%d",&x,&y,&z);
G[x].push_back((edge){x,y,z});
}
for (int i=;i<=n;i++) sort(G[i].begin(),G[i].end());
Max=;
for (int i=;i<=l;i++) scanf("%d",&qu[i]),Max=max(Max,qu[i]);
Dijkstra();
for (int i=;i<=l;i++)
printf("%lld\n",ans[qu[i]]);
}
return ;
}
2019CCPC网络赛 HDU6705 - path K短路的更多相关文章
- 2019ccpc网络赛hdu6705 path
path 题目传送门 解题思路 先用vector存图,然后将每个vector按照边的权值从小到大排序.将每个顶点作为起点的边里最短的边存入优先队列.对于存入优先队列的信息,应有边起点,终点,是其起点的 ...
- 2019CCPC网络预选赛 1004 path 最短路
题意:给你一张n个点m条边的有向图,问这张有向图的所有路径中第k短的路径长度是多少?n, m, k均为5e4级别. 思路:前些日子有一场div3的F和这个题有点像,但是那个题要求的是最短路,并且k最大 ...
- [2019CCPC网络赛][hdu6704]K-th occurrence(后缀数组&&主席树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6704 题意为查询子串s[l...r]第k次出现的位置. 写完博客后5分钟的更新 写完博客才发现这份代码 ...
- ccpc网赛 hdu6705 path(队列模拟 贪心
http://acm.hdu.edu.cn/showproblem.php?pid=6705 这是比赛前8题过的人数第二少的题,于是就来补了,但感觉并不难啊..(怕不是签到难度 题意:给个图,给几条路 ...
- 2019CCPC网络赛
^&^ (HDU 6702) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- hdu6075 2019CCPC网络选拔赛1004 path
题意:给定一个带权有向图,有q组询问,每次询问在有向图的所有路径中,第k小的路径权值 解题思路:因为k最大只有5e4,考虑暴力搜索出前maxk小的路径并用数组记录权值,然后就可以O(1)查询. 具体实 ...
- 2019CCPC网络赛 C - K-th occurrence HDU - 6704(后缀数组+ST表+二分+主席树)
题意 求区间l,r的子串在原串中第k次出现的位置. 链接:https://vjudge.net/contest/322094#problem/C 思路 比赛的时候用后缀自动机写的,TLE到比赛结束. ...
- 2019年南京网络赛E题K Sum(莫比乌斯反演+杜教筛+欧拉降幂)
目录 题目链接 思路 代码 题目链接 传送门 思路 首先我们将原式化简: \[ \begin{aligned} &\sum\limits_{l_1=1}^{n}\sum\limits_{l_2 ...
- 2019CCPC网络赛 HD6707——杜教筛
题意 求 $f(n,a,b)=\sum_{i=1}^n \sum_{j=1}^i gcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\%(10^9+7)$,$1 \le n,a,b \l ...
随机推荐
- js代码检测设备问题:为什么在移动端检测设备的时候会出现pc的页面
为了在手机上也能正常显示页面,所以为之前写的页面又重写了一遍,专门用来在移动端显示,用js代码检测设备,如果是pc就显示pc的页面,如果是移动就显示移动的页面,但遇到一个问题就是在移动端打开会有一个延 ...
- JAVA中位数排序
package quickSort; public class QuickSort { private static int count; /** * 测试 * @param args */ publ ...
- shell脚本检索所有mysql数据库中没有primary key的表
1.mkdir -p /root/scripts/ 2. cd /root/scripts/ vim query.sql,代码如下: SELECT CONCAT(t.table_schema,&quo ...
- html5 带声音的导航
代码实例: <!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3. ...
- 前端每日实战:67# 视频演示如何用纯 CSS 创作单元素点阵 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览.https://codepen.io/comehope/pen/YvBvBr 可交互视频 此视频是可以 ...
- CF 49E Common ancestor
传送门 模拟赛T1就自闭了( 才不会说我是去刚T2了来着 感觉非常暴力的一个题? 出题人良心开大数据范围 n=100 还是原来的n^4*26算法我也是自闭了 不过貌似跑不到n^4? 真·大力出奇迹 一 ...
- RabbitMQ之交换机
1. 交换机类型 rabbitmq常见有四种交换机类型: direct, topic, fanout, headers. 一般headers都不用,工作中用得较多的是fanout,它会将消息推送到所有 ...
- sql查看数据库环境及一些参数
sql查看数据库环境及一些参数 select parent_obj from sysobjects where name='FK_Student_banjiID' --根据外键名得到外表id sele ...
- Python基础教程(019)--执行Python的方式,IPython
前言 了解IPython 内容 IPython 是一个Python的交互式shell,比默认的Python shell 好用的多 查看图片 在提示符下执行 目的 了解进入IPython 退出IPyth ...
- [CSP-S模拟测试]:树(树形DP+期望)
题目描述 梦游中的你来到了一棵$N$个节点的树上.你一共做了$Q$个梦,每个梦需要你从点$u$走到点$v$之后才能苏醒,由于你正在梦游,所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...