K短路,顾名思义,是让你求从$s$到$t$的第$k$短的路。

暴力当然不可取,那么我们有什么算法可以解决这个问题?

--------------------------

首先,我们要维护一个堆。

struct node
{
int dist,pos;
bool operator <(const node&x) const
{
return dist>x.dist;
}
}
priority_queue<node> q;

这个堆是用来干什么的?

----------------------------------------------

这时候要提到一种新算法:A*算法。

估价函数:$f[i]=g[i]+h[i]$。其中,$g[i]$是从起点$s$走,按照这条路径到当前点已经走了多少路程,$h[i]$是当前点到终点$t$的最短路。

我们用之前开设的堆来维护这个估价函数,这样到达第k次终点$t$的路径即为所求。

Code(这里是[SDOI2010]魔法猪学院的A*算法):

void Astar(int kk)
{
priority_queue<SKT> q;
memset(vis,,sizeof(vis));
x.pos=;x.dist=0.0;x.h=0.0;
q.push(x);
while(!q.empty())
{
int now=q.top().pos;double d=q.top().dist;double hh=q.top().h;q.pop();
if (d>E) return;
vis[now]++;
if (now==n){ans++;E-=d;continue;}
if (vis[now]>kk) continue;
for (int i=head[now];i;i=edge[i].next)
{
int to=edge[i].to;
SKT Faker;
Faker.pos=to;Faker.h=hh+edge[i].dis;Faker.dist=Faker.h+dis[to];
q.push(Faker);
}
}
}

----------------------------------

每个点到终点$t$的最短路怎么求?很简单,我们只要在建图的时候再建一个反向图,从终点跑单源最短路径即可。

Code:

void spfa()
{
for (int i=;i<=n;i++) dis[i]=0x3f3f3f3f;
queue<int> q;
q.push(n);dis[n]=0.0;vis[n]=;
while(!q.empty())
{
int now=q.front();q.pop();vis[now]=;
for (int i=Head[now];i;i=Edge[i].next)
{
int to=Edge[i].to;
if (dis[to]>dis[now]+Edge[i].dis)
{
dis[to]=dis[now]+Edge[i].dis;
if (!vis[to]) q.push(to),vis[to]=;
}
}
}
}

----------------------------

例题:[USACO08MAR]Cow Jogging G

近乎于K短路的裸题,只需要注意$u$大于$v$即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=;
const int maxm=;
int dis[maxn],vis[maxn];
int n,m,k;
struct SKT {
int v;
int dist;
bool operator < (const SKT&p) const {
return dist+dis[v]>p.dist+dis[p.v];
}
};
SKT x;
struct Node
{
int next,to,dis;
}edge[maxm],cont[maxm];
int heade[maxm],headc[maxm],cnt;
inline void add(int from,int to,int dis)
{
edge[++cnt].next=heade[from];
edge[cnt].to=to;
edge[cnt].dis=dis;
heade[from]=cnt;
cont[cnt].next=headc[to];
cont[cnt].to=from;
cont[cnt].dis=dis;
headc[to]=cnt;
}
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
void spfa()
{
queue<int> q;
for (int i=;i<=n;i++) dis[i]=0x7fffffff;
q.push();dis[]=;vis[]=;
while(!q.empty())
{
int now=q.front();q.pop();vis[now]=;
for (int i=headc[now];i;i=cont[i].next)
{
int to=cont[i].to;
if (dis[to]>dis[now]+cont[i].dis)
{
dis[to]=dis[now]+cont[i].dis;
if (!vis[to]) q.push(to),vis[to]=;
}
}
}
}
void Astar()
{
int ans=;
priority_queue<SKT> q;
x.v=n;x.dist=;
q.push(x);
while(!q.empty())
{
SKT now=q.top();q.pop();
if (now.v==) printf("%d\n",now.dist),++ans;
if (ans==k) return;
for (int i=heade[now.v];i;i=edge[i].next)
{
int to=edge[i].to;
if (to<now.v)
{
SKT Faker=now;
Faker.v=to;Faker.dist=now.dist+edge[i].dis;
q.push(Faker);
}
}
}
while(ans<k) cout<<-<<endl,++ans;
return;
}
signed main()
{
n=read(),m=read(),k=read();
for (int i=;i<=m;i++)
{
int x=read(),y=read(),z=read();
if (x>y) add(x,y,z);
}
spfa();
Astar();
return ;
}

K短路 学习笔记的更多相关文章

  1. A* k短路 学习笔记

    题目大意 n个点,m条边有向图,给定S,T,求不严格k短路 n<=1000 m<=100000 k<=1000 不用LL 分析 A*算法 f(i)表示从S出发经过i到T的估价函数 \ ...

  2. 【学习笔记】K 短路问题详解

    \(k\) 短路问题简介 所谓"\(k\) 短路"问题,即给定一张 \(n\) 个点,\(m\) 条边的有向图,给定起点 \(s\) 和终点 \(t\),求出所有 \(s\to t ...

  3. bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]

    1598: [Usaco2008 Mar]牛跑步 题意:k短路 ~~貌似A*的题目除了x数码就是k短路~~ \[ f(x) = g(x) + h(x) \] \(g(x)\)为到达当前状态实际代价,\ ...

  4. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. 算法笔记--次小生成树 && 次短路 && k 短路

    1.次小生成树 非严格次小生成树:边权和小于等于最小生成树的边权和 严格次小生成树:    边权和小于最小生成树的边权和 算法:先建好最小生成树,然后对于每条不在最小生成树上的边(u,v,w)如果我们 ...

  6. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  7. kruskal重构树学习笔记

    \(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal​\) 求最小(大)生成树,树上求 \(lca​\). 算法详 ...

  8. Day 4 学习笔记 各种图论

    Day 4 学习笔记 各种图论 图是什么???? 不是我上传的图床上的那些垃圾解释... 一.图: 1.定义 由顶点和边组成的集合叫做图. 2.分类: 边如果是有向边,就是有向图:否则,就是无向图. ...

  9. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

随机推荐

  1. 干货分享丨jvm系列:dump文件深度分析

    摘要:java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因.那么dump文件的内容是什么样的呢? JVM ...

  2. redis(十七):Redis 安装,部署(WINDOWS环境下)

    1.下载Redis安装文件, 我选择的是 3.0.504 版本,有zip或msi可供下载.   2.解压缩后,打开安装目录 双击redis-server.exe启动redis服务器,双击redis-c ...

  3. 01-flask旅行网系统功能设计

    应用flask框架实现一个介绍旅游景区及旅游攻略的网站,一个旅行网包括前台和后台两部分,前台部分用户使用,后台部分管理员使用,系统开发坏境如下: 虚拟环境:virtualenv 数据库:MySQL 开 ...

  4. js常见删除绑定的事件

    1. elem.onclick = null / false;  //直接解除 例子如下: var div = document.getElemetById('id'); div.onclick = ...

  5. J.U.C体系进阶(二):juc-locks 锁框架

    Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-locks 锁框架 接口说明 Lock接口 类型 名称 void loc ...

  6. Cyber Security - Palo Alto Security Policies(1)

    Security policies: Enforcing network traffic by configuring rules of what is allowed or denied to co ...

  7. Go Pentester - HTTP Servers(2)

    Routing with the gorilla/mux Package A powerful HTTP router and URL matcher for building Go web serv ...

  8. Oracle基础概述

    本部分主要参考”风哥“的Oracle入门视频. 一.体系结构概述 1.物理结构(文件结构) Oracle有四种文件:控制文件.数据文件.日志文件.参数文件 其中日志文件分为两类:联机日志文件.归档日志 ...

  9. Active Directory - Creating Public and Personnel Share Folders via Script

    Create and save the following scripts on the DC folder \\Winsever2019\sysvol\pandabusiness.local\scr ...

  10. 关于git,无论是命令使用还是深入学习,看我总结就够了

    周五了,又是划水的一下午,无意中在某号上发现了这样一张图,说的内容很简单,就是我们日常离不开的git,可能因为最近github宕机,网传服务器被盗的新闻把,让我瞬间产生了兴趣,就点进去看一下 大家能看 ...