题意:给定一个带权有向图,有q组询问,每次询问在有向图的所有路径中,第k小的路径权值

解题思路:因为k最大只有5e4,考虑暴力搜索出前maxk小的路径并用数组记录权值,然后就可以O(1)查询。

具体实现:暴力搜索时可以借助Dijkstra最短路的思想,即用已知的最短路更新得出新的最短路。先将所有的边都装进一个multiset里面,然后每次将multiset里的首元素取出,作为新的答案,然后再用它来更新新的最短路,这样不断扩散的话就可以得到答案。

但是,这样可能会TLE或MLE,考虑再加加优化,首先我们只需要前maxk小的路径,所以multiset的可以限制在maxk以内,这样就不会MLE了,然后我们还可以先对每个节点的邻接表中的边按权值从小到大排序,这样在枚举的时候如果新路径的权值大于multiset中的最大值就可以直接break掉,这样就不会TLE了。

AC代码:

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn=5e4+5;
const int MAXK=5e4+5;
int n,m,q,k; struct Edge{
int id,u,v;
ll w;
bool operator<(const Edge& b)const{return w<b.w;}
}; multiset<Edge>s; vector<Edge>G[maxn];
ll ans[MAXK];
int tot,maxk,qry[maxn]; void init(){
for(int i=1;i<=n;i++)sort(G[i].begin(),G[i].end());
int cnt=0;
while(true){ //cout<<"S:\n";for(auto i:s)cout<<i.u<<" "<<i.v<<" "<<i.w<<"\n"; ans[++cnt]=s.begin()->w;
Edge e=*s.begin(),tmp;
s.erase(s.begin());
if(cnt>=maxk)break; int psz=(int)s.size(); int sz=(int)G[e.v].size(); if((int)s.size()+sz<=maxk){
for(int i=0;i<sz;i++){
Edge t=G[e.v][i];
tmp.id=++tot;tmp.u=e.u;tmp.v=t.v;tmp.w=e.w+t.w;
s.insert(tmp);
}
}
else{
for(int i=0;i<sz;i++){
Edge t=G[e.v][i];
if((int)s.size()<=maxk){
tmp.id=++tot;tmp.u=e.u;tmp.v=t.v;tmp.w=e.w+t.w;
s.insert(tmp);
}
else{
Edge last=*(--s.end());
if(last.w>e.w+t.w){
s.erase(last);
tmp.id=++tot;tmp.u=e.u;tmp.v=t.v;tmp.w=e.w+t.w;
s.insert(tmp);
}
else break;
}
}
}
}
} int main()
{
//#ifndef ONLINE_JUDGE
// freopen("in.txt","r",stdin);
//#endif
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&n,&m,&q); for(int i=1;i<=n;i++)G[i].clear();
s.clear();tot=0; int u,v;
ll w;
Edge tmp;
for(int i=1;i<=m;i++){
scanf("%d %d %lld",&u,&v,&w);
tmp.id=++tot;tmp.u=u;tmp.v=v;tmp.w=w;
G[u].push_back(tmp);
s.insert(tmp);
}
maxk=0;
for(int i=1;i<=m;i++){
scanf("%d",&qry[i]);
maxk=max(maxk,qry[i]);
}
init();
for(int i=1;i<=m;i++){
printf("%lld\n",ans[qry[i]]);
}
}
return 0;
}

hdu6075 2019CCPC网络选拔赛1004 path的更多相关文章

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

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

  2. 2019ccpc网络赛hdu6705 path

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

  3. 2016中国大学生程序设计竞赛 - 网络选拔赛 1004 Danganronpa

    Problem Description Chisa Yukizome works as a teacher in the school. She prepares many gifts, which ...

  4. 2017中国大学生程序设计竞赛 - 网络选拔赛 1004 HDU 6153 A Secret (字符串处理 KMP)

    题目链接 Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a presen ...

  5. 2019CCPC网络选拔赛 hdu6703 array(主席树+set)

    题意 给你一个1~n的排列,由两种操作: 1 pos:将a[pos]+10 000 000 2 r k:求大于等于k且不等于a[1~r]的数的最小值. 强制在线. 思路 如果没有1操作,那么我们直接主 ...

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

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

  7. hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀自动机+线段树合并

    解题思路: fail树上用权值线段树合并求right/endpos集合,再用倍增找到待查询串对应节点,然后权值线段树求第k大. #include<bits/stdc++.h> using ...

  8. hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀数组

    题意:给你一个长度为n的字符串,有q个询问,每次询问一个子串s(l,r)第k次出现的位置,若子串出现次数少于k次输出-1. 解题思路:先把SA跑出来,然后对于每次询问可以由l和rank[]找到l在所有 ...

  9. [BFS,A*,k短路径] 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 path (Problem - 6705)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6705 path Time Limit: 2000/2000 MS (Java/Others)    Mem ...

随机推荐

  1. json&pickle&shelve

    之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了 ...

  2. Kaggle-pandas(5)

    Data-types-and-missing-values 教程 Dtypes DataFrame或Series中列的数据类型称为dtype.您可以使用dtype属性来获取特定列的类型. 例如,我们可 ...

  3. Windows-快速预览文件-QuickLook

    开源.免费的文件快速预览工具, 支持图片.文档.音视频.代码文本.压缩包等多种格式. 获得 Mac OS 空格键快速预览文件相同的体验 效果图 文件夹 音视频 浏览 压缩包,文本 支持的格式: 图片: ...

  4. 使用JSPWiki丰富Unity-UPM包的使用

    1.简述 诸如npm.Nuget之类的包管理工具,Unity推出了自己的Unity Package Manager(UPM)工具来管理使用到的第三方库. 现在Unity Package Manager ...

  5. tableau用户留存分析

    1.数据源 这是个母婴产品的购买流水数据 2.数据处理 字段拆分.创建购买点会员生命周期 3.分析不同省份的留存率情况 根据第12个月的留存率对省市进行分组 实际业务中也可以通过类似的方法对用户年龄组 ...

  6. CSDN新版Markdown编辑器(Alpha 2.0版)

    Markdown编辑器 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建 ...

  7. C#LeetCode刷题-贪心算法

    贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配   17.8% 困难 45 跳跃游戏 II   25.5% 困难 55 跳跃游戏   30.6% 中等 122 买卖股票的最佳时机 II C ...

  8. 聊聊MySQL常用的4种主从复制架构

    目录 一主多从复制架构 多级复制架构 双主(Dual Master)复制架构 多源(Multi-Source)复制架构 如何优化主从延迟问题? 复制的4中常见架构有一主多从复制架构.多级复制架构.双主 ...

  9. GUAVA-cache实现

    GUAVA  Cache Guava Cache与ConcurrentMap很相似基于分段锁及线程安全,但也不完全一样.最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除 ...

  10. 【算法•日更•第三十二期】教你用出windows体验的Linux

    ▎前言 小编昨天闲的不行,就装了一个linux系统,linux的发行版很多,小编认为ubuntu很好用,于是就在使用ubuntu. 没错,我现在就在使用ubuntu来写博客. 刚才还装了一个QQ,不过 ...