题意:给出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短路的更多相关文章

  1. 2019ccpc网络赛hdu6705 path

    path 题目传送门 解题思路 先用vector存图,然后将每个vector按照边的权值从小到大排序.将每个顶点作为起点的边里最短的边存入优先队列.对于存入优先队列的信息,应有边起点,终点,是其起点的 ...

  2. 2019CCPC网络预选赛 1004 path 最短路

    题意:给你一张n个点m条边的有向图,问这张有向图的所有路径中第k短的路径长度是多少?n, m, k均为5e4级别. 思路:前些日子有一场div3的F和这个题有点像,但是那个题要求的是最短路,并且k最大 ...

  3. [2019CCPC网络赛][hdu6704]K-th occurrence(后缀数组&&主席树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6704 题意为查询子串s[l...r]第k次出现的位置. 写完博客后5分钟的更新 写完博客才发现这份代码 ...

  4. ccpc网赛 hdu6705 path(队列模拟 贪心

    http://acm.hdu.edu.cn/showproblem.php?pid=6705 这是比赛前8题过的人数第二少的题,于是就来补了,但感觉并不难啊..(怕不是签到难度 题意:给个图,给几条路 ...

  5. 2019CCPC网络赛

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

  6. hdu6075 2019CCPC网络选拔赛1004 path

    题意:给定一个带权有向图,有q组询问,每次询问在有向图的所有路径中,第k小的路径权值 解题思路:因为k最大只有5e4,考虑暴力搜索出前maxk小的路径并用数组记录权值,然后就可以O(1)查询. 具体实 ...

  7. 2019CCPC网络赛 C - K-th occurrence HDU - 6704(后缀数组+ST表+二分+主席树)

    题意 求区间l,r的子串在原串中第k次出现的位置. 链接:https://vjudge.net/contest/322094#problem/C 思路 比赛的时候用后缀自动机写的,TLE到比赛结束. ...

  8. 2019年南京网络赛E题K Sum(莫比乌斯反演+杜教筛+欧拉降幂)

    目录 题目链接 思路 代码 题目链接 传送门 思路 首先我们将原式化简: \[ \begin{aligned} &\sum\limits_{l_1=1}^{n}\sum\limits_{l_2 ...

  9. 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 ...

随机推荐

  1. 使用jstack排查线程问题

    以一个例子来演示排查服务器cpu占用率过高的问题. 准备 将下面的代码文件上传到服务器上,然后使用javac编译,并使用java命令将程序跑起来. public class JStackCase { ...

  2. 厉害了!新AI人工智能研究令人大开眼界

    AI人工智能有很多方法可以操纵照片,让您看起来更好看,消除红眼或镜头眩光等等.但到目前为止,眨眼已经证明了一个顽强的快照对手. 这远远不是智能“绘画中”的唯一例子,因为当一个程序用它认为属于的地方填充 ...

  3. 关系型数据库---MYSQL---优化

    1.为什么要进行SQL优化? 1.1 查询性能低 1.2 执行时间过长 1.3 等待时间过长 1.4 SQL写的太差(尤其是多表关联查询) 1.5 索引失效 1.6 服务器参数(缓存.线程数)设置不合 ...

  4. @PostMapping

    @PostMapping映射一个POST请求 Spring MVC新特性 提供了对Restful风格的支持 @GetMapping,处理get请求 @PostMapping,处理post请求 @Put ...

  5. springboot 加载jsp 刷新jsp ,刷新Controller (亲自尝试)

    解决jsp加载成功.<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId&g ...

  6. php is_file()函数 语法

    php is_file()函数 语法 is_file()函数怎么用? php is_file()函数用于判断给定文件名是否为一个正常的文件,语法是bool is_file ( string $file ...

  7. 【BZOJ2946&SPOJ1812】公共串(后缀自动机)

    题意:给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 单词的数量<=5,单词的长度至少为1,最大为2000. 思路: #include<bits/stdc++.h> us ...

  8. paper 164: Siamese网络--相似度量方法

    简介:    Siamese网络是一种相似性度量方法,当类别数多,但每个类别的样本数量少的情况下可用于类别的识别.分类等.传统的用于区分的分类方法是需要确切的知道每个样本属于哪个类,需要针对每个样本有 ...

  9. hdu 5181 numbers——思路+区间DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...

  10. CoffeeScript编写简单新闻页(仅UI)

    CoffeeScript编写简单新闻页(仅UI) 1. 配置(在公司搭建好的环境下配置) omnisocials-backend/src/backend/modules/member/config/m ...