题意:给出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 ;
}

最新文章

  1. Java系列笔记(2) - Java RTTI和反射机制
  2. 【转帖】四种BI 开源工具介绍-SpagoBI,openI,JasperSoft,Pentaho
  3. js最新手机号码、身份证正则表达式
  4. PHP面向对象:类型提示
  5. BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路
  6. SICP 解题集 — SICP 解题集
  7. 转 Java输入输出流详解(非常详尽)
  8. install pytorch
  9. 数组中存放对象之java中定义类数组存放类
  10. Java并发框架——AQS阻塞队列管理(一)——自旋锁
  11. 日志收集ELK+kafka相关博客
  12. Oracle单机Rman笔记[6]---记一次oracle脱机异地还原
  13. 微信公众号授权,支付,退款总结【shoucang】
  14. Could not load file or assembly &#39;System.Web.Mvc, Version=5.2.3.0...
  15. python 处理时间 datetime 三板斧
  16. 微信小程序之----制作视频弹幕
  17. splay好板子
  18. [转]sqlserver2014两台不同服务器上数据库同步
  19. 【计算机网络】数据交换技术和多路复用技术的正(nao)确(can)打开方式
  20. struts2从浅至深(六)总结

热门文章

  1. find命令使用详解
  2. elasticsearch删除
  3. SAP固定资产(FI-AA),一网打尽(转)
  4. MySQLdb-python安装
  5. NCRE训练二
  6. day15 python lambda函数 递归函数 二分法
  7. postman自动化接口测试
  8. Web核心之会话技术Cookie&amp;Session
  9. linux网络接口,struct ifreq struct ifconf结构
  10. [CSP-S模拟测试]:platform(后缀数组+二分+线段树)