path

题目传送门

解题思路

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

代码如下

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll; const int N = 100010; struct T{
int x, y, f;
ll w;
T(int x, int y, ll w, int f): x(x), y(y), w(w), f(f){}
bool operator<(const T& a)const{
return w > a.w;
}
}; struct line{
int r;
ll w;
line(int r, ll w): r(r), w(w){}
bool operator<(const line& a)const{
return w < a.w;
}
};
vector<line> vec[N];
struct R{
int i, k;
bool operator<(const R& a)const{
return k < a.k;
}
}qy[N];
ll ans[N];
priority_queue<T> pq; 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 <= m; i ++){
int u, v;
ll w;
scanf("%d%d%lld", &u, &v, &w);
vec[u].push_back(line(v, w));
}
for(int i = 1; i <= n; i ++){
sort(vec[i].begin(), vec[i].end());
}
for(int i = 1; i <= n; i ++){
if(vec[i].size())
pq.push(T(i, vec[i][0].r, vec[i][0].w, 0));
}
for(int i = 1; i <= q; i ++){
scanf("%d", &qy[i].k);
qy[i].i = i;
}
sort(qy + 1, qy + q + 1);
int cnt = 0;
int id = 1;
while(!pq.empty()){
int x = pq.top().x;
int y = pq.top().y;
ll w = pq.top().w;
int f = pq.top().f;
pq.pop();
++cnt;
while(id <= q && cnt == qy[id].k){
ans[qy[id].i] = w;
++id;
}
if(id > q)
break;
if(vec[y].size())
pq.push(T(y, vec[y][0].r, w + vec[y][0].w, 0));
if(vec[x].size() > f + 1)
pq.push(T(x, vec[x][f + 1].r, w + vec[x][f + 1].w - vec[x][f].w, f + 1));
}
for(int i = 1; i <= q; i ++){
printf("%lld\n", ans[i]);
}
for(int i = 0; i <= n; i ++)
vec[i].clear();
while(!pq.empty())
pq.pop();
}
return 0;
}

最新文章

  1. js实现控制日期月份增减
  2. java中日历代码的实现
  3. Android各组件/控件间通信利器之EventBus
  4. ruby的hash学习笔记例: 将字符串文本中的单词存放在map中
  5. 基于s5pv210嵌入式linux系统sqlite3数据库移植
  6. PowerDesigner(一)-PowerDesigner概述(系统分析与建模)(转)
  7. JS学习笔记 -- 定时器,提示框的应用
  8. Android开源项目发现---Menu 篇(持续更新)
  9. 转:.NET中使用Redis (一)
  10. bzoj2539
  11. 【剑指Offer学习】【面试题43 : n 个锻子的点数】
  12. web项目docker化的两种方法
  13. CentOS 单用户登录&amp;命令行、图像界面
  14. linux根据端口号查询来源程序
  15. Android 8.1 源码_启动篇(二) -- 深入研究 zygote(转 Android 9.0 分析)
  16. HTML多图片压缩上传
  17. react-router@4.0 使用和源码解析
  18. node.js中对 mysql 进行增删改查等操作和async,await处理
  19. 关于根据模板生成pdf文档,差入图片和加密
  20. How to set asp.net Identity cookies expires time

热门文章

  1. 记录MNIST实现与理解
  2. MySQL 添加用户、删除用户与授权
  3. 购物车1.0版——python第5天
  4. ORCAL 数据库的约束以及SQL语言的四种类型
  5. c# Winform dev控件之ChartControl
  6. pixi与lottie-web的benchmark测试
  7. redis 入门之集合
  8. Using-JSONNET-for-dynamic-JSON-parsing
  9. 使用jquery.validate组件进行前端数据验证并实现异步提交前验证检查
  10. spring 事物(一)—— 事物详解