Tags

搜索、\(\text{A*}\)、很酷很炫的算法


  • 定义二元组\(\text{DIS(X,Now)}\)表示到达\(\text{X}\)点,路程是\(\text{Now}\);
  • 反向\(\text{SPFA/Dijkstra}\)作为每个点的估价函数;
  • 从队首取出\(\text{DIS}\),扩展状态;
  • 每当获得一个\(\text{DIS}​\)就加入到\(\text{priority_queue}​\)里面去;

Code:

#include <cstdio>
#include <cstring>
#include <queue>
#define re register
#define GC getchar()
#define Clean(X,K) memset(X,K,sizeof(X))
int Qread () {
int X = 0 ; char C = GC ;
while (C > '9' || C < '0') C = GC ;
while (C >='0' && C <='9') {
X = X * 10 + C - '0' ;
C = GC ;
}
return X ;
}
const int Maxn = 5005 , Maxm = 400005 , INF = 20021020 << 2;
int N , M , Head[Maxn] , En = 0 , Vis[Maxn] ;
double Ek , Mdis[Maxn];
struct DIS {
int X ;
double Now ;
};
bool operator < (const DIS &A , const DIS &B) {
return A.Now + Mdis[A.X ] > B.Now + Mdis[B.X ] ;
}
std :: priority_queue <DIS> Q ;
struct Edge {
int From_Point , Goto_Point , Next_Edge ;
double Lenth_of_Edge ;
};
Edge E[Maxm] ;
void Adg (int X , int Y , double L) {
E[++En].From_Point =X ;
E[En].Goto_Point = Y ;
E[En].Next_Edge = Head[X] ;
E[En].Lenth_of_Edge = L ;
Head[X] = En ;
}
void SPFA () {
std :: queue <int> Q ;
for (re int i = 1 ; i <= N; ++ i) Mdis[i] = INF ;
Clean (Vis , 0) , Mdis[N] = 0 ;
Q.push(N) ;
while (!Q.empty()) {
int Now = Q.front() ;
Q.pop() ;
Vis[Now] = 0 ;
for (re int i = Head[Now] ; i; i = E[i].Next_Edge ) {
double Dis = Mdis[Now] + E[i].Lenth_of_Edge ;
if (Mdis[E[i].Goto_Point ] > Dis) {
Mdis[E[i].Goto_Point ] = Dis ;
if (!Vis[E[i].Goto_Point ]) {
Vis[E[i].Goto_Point ] = 1 ;
Q.push(E[i].Goto_Point ) ;
}
}
}
}
}
DIS Mp (int X , double Now) {
DIS Ans ;
Ans.X = X , Ans.Now = Now ;
return Ans ;
}
int main () {
// freopen ("P2483.in" , "r" , stdin) ;
N = Qread () , M = Qread () ;
scanf ("%lf" , &Ek) ;
Clean (Head , 0) , En = 0 ;
for (re int i = 1 ; i <= M; ++ i) {
double L ;
int X = Qread () , Y = Qread () ;
scanf ("%lf" , &L) ;
Adg (Y , X , L) ;
}
SPFA () ;
Clean(Head , 0 ) , En = 0 , M <<= 1 ;
for (re int i = 1 ; i <= M ; ++ i) Adg (E[i].Goto_Point , E[i].From_Point , E[i].Lenth_of_Edge ) ;
M >>= 1 ;
Q.push(Mp(1 , 0)) ;
int Ans = 0 ;
while (!Q.empty()) {
DIS Now = Q.top() ;
Q.pop() ;
if (Now.X == N) {
Ek -= Now.Now ;
if (Ek < 0) break ;
++ Ans ;
continue ;
}
for (re int i = Head[Now.X ] ; i; i = E[i].Next_Edge ) Q.push(Mp(E[i].Goto_Point , Now.Now + E[i].Lenth_of_Edge )) ;
}
printf ("%d\n" , Ans) ;
fclose (stdin) , fclose (stdout) ;
return 0 ;
}

Thanks!

【模板】 $\text{K}$ 短路的更多相关文章

  1. 强连通分量算法·$tarjan$初探

    嗯,今天好不容易把鸽了好久的缩点给弄完了--感觉好像--很简单? 算法的目的,其实就是在有向图上,把一个强连通分量缩成一个点--然后我们再对此搞搞事情,\(over\) 哦对,时间复杂度很显然是\(\ ...

  2. 洛谷 题解 P1772 【[ZJOI2006]物流运输】

    题目描述 物流公司要把一批货物从码头\(A\)运到码头\(B\).由于货物量比较大,需要\(n\)天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过 ...

  3. 洛谷 题解 UVA12661 【有趣的赛车比赛 Funny Car Racing】

    [题意] 在一个赛车比赛中,赛道有\(n(n<=300)\)个交叉点和\(m(m<=50000)\)条单向道路.有趣的是,每条道路都是周期性关闭的.每条道路用5个整数\(u,v,a,b,t ...

  4. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  5. 最短路--floyd算法模板

    floyd算法是求所有点之间的最短路的,复杂度O(n3)代码简单是最大特色 #include<stdio.h> #include<string.h> ; const int I ...

  6. HDU - 2680 最短路 spfa 模板

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2680 题目大意,就是一个人可以从多个起点开始出发,看到终点的最短路是多少..只有可以运用和hdu2066 ...

  7. [Luogu1342] 请柬 - 最短路模板

    Description 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被 ...

  8. <script type="text/x-template"> 模板

    获取动态的js模板可以用art-template插件 <script type="text/template"> 给<script>设置type=" ...

  9. 单源最短路——Dijkstra模板

    算法思想: 类似最小生成树的贪心算法,从起点 v0 每次新拓展一个距离最小的点,再以这个点为中间点,更新起点到其他点的距离. 算法实现: 需要定义两个一维数组:①vis[ i ] 表示是否从源点到顶点 ...

随机推荐

  1. 【斐波那契数列】java探究

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 解析 (1)递归方式 对于公式f(n) = f(n-1) + f(n ...

  2. PyQt:无边框自定义标题栏及最大化最小化窗体大小调整

    环境 Python3.5.2 PyQt5 陈述 隐藏掉系统的控制栏,实现了自定义的标题控制栏,以及关闭/最大化/最小化的功能,自由调整窗体大小的功能(跟随一个大佬学的),代码内有详细注释 只要把Mai ...

  3. shell函数-3

    1.shell函数 1.1.shell函数定义 对于重复出现的代码,在shell中可以定义函数,然后在指定的地方调用即可.便于代码复用,提高开发效率. 定义函数的语法如下: function 函数名( ...

  4. Signalr指定Websocket方式跨域数据传输

    跨域通俗理解就是两个域名后面的web服务地址,即都是独立的网站.现实业务的情况会有很多需要跨域推送数据的情况, 比如类似饿了么商户后台会收到客户端确认订单后,后台服务会推送一条订单消息给商户前台. S ...

  5. ZooKeeper的三种典型应用场景

    引言 ZooKeeper是中典型的pub/sub模式的分布式数据管理与协调框架,开发人员可以使用它进行分布式数据的发布与订阅.另外,其丰富的数据节点类型可以交叉使用,配合Watcher事件通知机制,可 ...

  6. MySQL高可用复制管理工具 —— Orchestrator介绍

    背景 在MySQL高可用架构中,目前使用比较多的是Percona的PXC,Galera以及MySQL 5.7之后的MGR等,其他的还有的MHA,今天介绍另一个比较好用的MySQL高可用复制管理工具:O ...

  7. Aooms_微服务基础开发平台实战_003_配置文件与简单的web环境搭建

    一.前言 本篇文章介绍两个重点 (1) 工程核心配置文件application.yml (2) 如何在一个标准的的SpringCloud工程上构建起一个基本的web结构 二.配置文件applicati ...

  8. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——ImageTabBar控件的使用方式

    一.          样式一 我们要实现上图中的效果,需要如下的操作: 从工具栏上的“Smobiler Components”拖动一个ImageTabBar控件到窗体界面上 修改ImageTabBa ...

  9. jQuery点击图片放大拖动查看效果

    效果如图: 放大前: 放大后(可拖动图片浏览): 源码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...

  10. 【微服务目录】.NET Core 微服务介绍

    介绍: 写这篇文章有多方面的原因,第一当然是为了以后自己可以随时翻阅,第二也算是一种积累吧.因为有些东西你弄个之后,过了很长时间不用,可能会有些忘却,但是你因为以前弄个吧,有不是那种小白,需要去找示例 ...