path

题目传送门

解题思路

先用vector存图,然后将每个vector按照边的权值从小到大排序。将每个顶点作为起点的边里最短的边存入优先队列。对于存入优先队列的信息,应有边起点,终点,是其起点的第几短边,以及路径总长度。优先队列按照路径长度从小到大排序,每次出队当前最短的路径,对于一条路径,更新两条新的可能最短的路径,即这条路后面加上一条可走的最短边,以及这条路最后一条边换成一条次短边。将询问排序,不断更新答案即可。

代码如下

  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3. using namespace std;
  4. typedef long long ll;
  5. const int N = 100010;
  6. struct T{
  7. int x, y, f;
  8. ll w;
  9. T(int x, int y, ll w, int f): x(x), y(y), w(w), f(f){}
  10. bool operator<(const T& a)const{
  11. return w > a.w;
  12. }
  13. };
  14. struct line{
  15. int r;
  16. ll w;
  17. line(int r, ll w): r(r), w(w){}
  18. bool operator<(const line& a)const{
  19. return w < a.w;
  20. }
  21. };
  22. vector<line> vec[N];
  23. struct R{
  24. int i, k;
  25. bool operator<(const R& a)const{
  26. return k < a.k;
  27. }
  28. }qy[N];
  29. ll ans[N];
  30. priority_queue<T> pq;
  31. int main()
  32. {
  33. int t;
  34. scanf("%d", &t);
  35. while(t --){
  36. int n, m, q;
  37. scanf("%d%d%d", &n, &m, &q);
  38. for(int i = 1; i <= m; i ++){
  39. int u, v;
  40. ll w;
  41. scanf("%d%d%lld", &u, &v, &w);
  42. vec[u].push_back(line(v, w));
  43. }
  44. for(int i = 1; i <= n; i ++){
  45. sort(vec[i].begin(), vec[i].end());
  46. }
  47. for(int i = 1; i <= n; i ++){
  48. if(vec[i].size())
  49. pq.push(T(i, vec[i][0].r, vec[i][0].w, 0));
  50. }
  51. for(int i = 1; i <= q; i ++){
  52. scanf("%d", &qy[i].k);
  53. qy[i].i = i;
  54. }
  55. sort(qy + 1, qy + q + 1);
  56. int cnt = 0;
  57. int id = 1;
  58. while(!pq.empty()){
  59. int x = pq.top().x;
  60. int y = pq.top().y;
  61. ll w = pq.top().w;
  62. int f = pq.top().f;
  63. pq.pop();
  64. ++cnt;
  65. while(id <= q && cnt == qy[id].k){
  66. ans[qy[id].i] = w;
  67. ++id;
  68. }
  69. if(id > q)
  70. break;
  71. if(vec[y].size())
  72. pq.push(T(y, vec[y][0].r, w + vec[y][0].w, 0));
  73. if(vec[x].size() > f + 1)
  74. pq.push(T(x, vec[x][f + 1].r, w + vec[x][f + 1].w - vec[x][f].w, f + 1));
  75. }
  76. for(int i = 1; i <= q; i ++){
  77. printf("%lld\n", ans[i]);
  78. }
  79. for(int i = 0; i <= n; i ++)
  80. vec[i].clear();
  81. while(!pq.empty())
  82. pq.pop();
  83. }
  84. return 0;
  85. }

2019ccpc网络赛hdu6705 path的更多相关文章

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

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

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

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

  3. 2019CCPC网络赛

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

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

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

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

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

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

  7. 2019CCPC网络赛 HDU 6702——找规律

    题意 给定 $A,B$(都是正整数),求使得 $(A\  xor\  C) \& (B \ xor \  C)$ 最小的正整数 $C$,如果有多个满足条件的 $C$,输出最小的 $C$. 分析 ...

  8. 2019CCPC网络赛——array(权值线段树)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6703 题目大意: 给出一个n(n<1e5)个元素的数组A,A中所有元素都是不重复的[1,n]. 有 ...

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

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

随机推荐

  1. Python 进阶_OOP 面向对象编程_组合与继承

    #目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...

  2. Html5 学习笔记 --》html基础 css 基础

    HTML5 功能 HTML5特点 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta cha ...

  3. 平衡二叉搜索树AVL

    package com.sunshine.AlgorithmTemplate; import com.sunshine.OFFER66_SECOND.BalanceTreeNode; import c ...

  4. js日历算法

    页面 <div class="un1"> <h2>服务档期</h2> <div class="date-panel" ...

  5. C语言|博客作业12

    一.我学到的内容(整理本课程所学,[用思维导图的方式] 二.我的收获(包括我完成的所有作业的链接+收获)不能只有作业链接,没有收获 作业链接 收获 https://edu.cnblogs.com/ca ...

  6. 深入理解javascript原型和闭包(4)——隐式原型 (转载)

    深入理解javascript原型和闭包(4)——隐式原型   注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设 ...

  7. Oralce分页

    SELECT *FROM ( SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ( SELECT A . ID AS "id", A .bill_noti ...

  8. java--二叉树解析及基本实现

    一.二叉树的结构 在进行链表结构开发的过程之中,会发现所有的数据按照首尾相连的状态进行保存,那么 在进行数据查询时为了判断数据是否存在,这种情况下它所面对的时间复杂度就是"O(n)" ...

  9. HTTP请求方式: GET和POST的比较

    GET和POST是HTTP的两个常用方法.   什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议 ...

  10. firmware

    路由器固件分析题,首先要安装firmware-mod-kit 安装命令: linux> sudo apt-get install git build-essential zlib1g-dev l ...