题意:给你一张n个点m条边的有向图,问这张有向图的所有路径中第k短的路径长度是多少?n, m, k均为5e4级别。

思路:前些日子有一场div3的F和这个题有点像,但是那个题要求的是最短路,并且k最大只有400。这个题的做法其实是一个套路(没见过QAQ)。

首先把每个点的出边按边权从小到大排序,把每个点边权最小的那条边放入优先队列。对于优先队列中的每个点,记录一下这个点是从哪个点转移过来(last),转移过来的边对于last来说是第几小(rank)。这时,从当前点now选一条边权最小的边,形成新了路径放入队列。把last点的第k + 1小的边和last形成的新路径放入队列。第k次出队的路径就是第k短了路径。直观感受上是对的,证明的话纸上画画可能就出来了吧QAQ。

代码:

#include <bits/stdc++.h>
#define LL long long
#define pli pair<LL, int>
#define pii pair<int, int>
using namespace std;
const int maxn = 100010;
vector<pli> G[maxn];
void add(int x, int y, long long z) {
G[x].push_back(make_pair(z, y));
}
struct edge {
int u, v;
LL w;
bool operator < (const edge& rhs) const {
return w < rhs.w;
}
};
edge a[maxn];
LL ans[maxn];
int b[maxn];
struct node {
int last, now, rank;
LL dis;
bool operator < (const node& rhs) const {
return dis > rhs.dis;
}
};
priority_queue<node> q;
int main() {
int T, n, m, t;
scanf("%d", &T);
while(T--) {
while(q.size()) q.pop();
scanf("%d%d%d", &n, &m, &t);
for (int i = 1; i <= n; i++) G[i].clear();
for (int i = 1; i <= m; i++) {
scanf("%d%d%lld", &a[i].u, &a[i].v, &a[i].w);
add(a[i].u, a[i].v, a[i].w);
}
int lim = 0;
for (int i = 1; i <= t; i++){
scanf("%d", &b[i]);
lim = max(lim, b[i]);
}
for (int i = 1; i <= n; i++) {
sort(G[i].begin(), G[i].end());
}
for (int i = 1; i <= n; i++) {
if(G[i].size()) {
q.push((node){i, G[i][0].second, 0, G[i][0].first});
}
}
for (int i = 1; i <= lim; i++) {
node tmp = q.top();
q.pop();
ans[i] = tmp.dis;
if(G[tmp.now].size())
q.push((node){tmp.now, G[tmp.now][0].second, 0, tmp.dis + G[tmp.now][0].first});
if(G[tmp.last].size() > tmp.rank + 1) {
q.push((node){tmp.last, G[tmp.last][tmp.rank + 1].second, tmp.rank + 1, tmp.dis - G[tmp.last][tmp.rank].first + G[tmp.last][tmp.rank + 1].first});
}
}
for (int i = 1; i <= t; i++) {
printf("%lld\n", ans[b[i]]);
}
}
}

  

2019CCPC网络预选赛 1004 path 最短路的更多相关文章

  1. 2019CCPC网络赛 HDU6705 - path K短路

    题意:给出n个点m条边的有向图,问图上第K短路的长度是多少(这里的路可以经过任何重复点重复边). 解法:解法参考https://blog.csdn.net/Ratina/article/details ...

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

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

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

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

  4. 2019ccpc网络赛hdu6705 path

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

  5. 2019CCPC网络预选赛 1003 K-th occurrence 后缀自动机 + 二分 + 主席树

    题意:给你一个长度为n的字符串,有m次询问,每次询问l到r的子串在原串中第k次出现的位置,如果没有输出-1.n, m均为1e5级别. 思路:后悔没学后缀数组QAQ,其实只要学过后缀数组这个题还是比较好 ...

  6. HDU 5833 (2016大学生网络预选赛) Zhu and 772002(高斯消元求齐次方程的秩)

    网络预选赛的题目……比赛的时候没有做上,确实是没啥思路,只知道肯定是整数分解,然后乘起来素数的幂肯定是偶数,然后就不知道该怎么办了… 最后题目要求输出方案数,首先根据题目应该能写出如下齐次方程(从别人 ...

  7. 2019南昌邀请赛网络预选赛 M. Subsequence

    传送门 题意: 给出一个只包含小写字母的串 s 和n 个串t,判断t[i]是否为串 s 的子序列: 如果是,输出"YES",反之,输出"NO": 坑点: 二分一 ...

  8. HDU 4762 Cut the Cake (2013长春网络赛1004题,公式题)

    Cut the Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  9. HDU 4751 Divide Groups (2013南京网络赛1004题,判断二分图)

    Divide Groups Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

随机推荐

  1. QTimer不能同时使用两个,用QTimerEvent (QT)

    最近写程序的时候有个界面想定两个QTimer定时器,不同时间干不同的事: QTimer *timer1 = new QTimer(this); QTimer *timer2 = new QTimer( ...

  2. kafka 磁盘写满导致 InternalError

    tailf kafka/log/server.log [2019-12-19 17:19:05,121] FATAL (main kafka.server.KafkaServerStartable 1 ...

  3. 【HDOJ6629】string matching(exkmp)

    题意:给定一个长为n的字符串,求其每个位置开始于其自身暴力匹配出相同或不同的结果的总比较次数 n<=1e6 思路:exkmp板子 #include<bits/stdc++.h> us ...

  4. .HDF数据库与SQLSERVER / ORACLE的区别

    无论ArcGIS的.gbd文件还是MapGIS的.hdf文件,都是数据库文件. 后缀是无意义的.有意义的是其中内在的逻辑和数据结构. https://zhidao.baidu.com/question ...

  5. C#防止窗口重复打开

    修改Program.cs文件 using System; using System.Collections.Generic; using System.Linq; using System.Windo ...

  6. Jenkins slave-agent.jnlp 无法安装为服务(install as a service)

    问题: 在部署持续集成环境,配置slave节点时遇到一个问题,slave-agent.jnlp可以正常启动运行(不能正常启动的点这里) 但是在保存为系统服务时,slave-agent.jnlp点击[i ...

  7. (3.1)狄泰软件学院C++课程学习剖析二

    深度剖析C++第二部分 1.通过对象名能够访问public成员变量.每个对象的成员变量都是专属的,成员变量不能够在对象之间共享. 2.需求:统计在程序运行期间某个类的对象数目,保证程序的安全性(不能使 ...

  8. BaseFragment 基类

    package com.test.mvp.mvpdemo.mvp.v6.basemvp; import android.os.Bundle;import android.support.annotat ...

  9. web服务器、WSGI跟Flask(等框架)之间的关系

    之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑.通过查阅了些资料,总算把它们的关系理清了. 总括来说,客户端从发送一个 HTT ...

  10. DJango安装-windows

    1.进入虚拟环境后启动 activate 2.查看当前虚拟环境是否存在Django环境 pip list 3.不存在则 安装Django环境 pip install django 4.查看Django ...