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. 从零打卡leetcode之day 1--两数之和

    前言 就是要把leetcode的题刷完,每天一道题,每天进步一点点 从零打卡leetcode之day 1 题目描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只 ...

  2. Kafka数据迁移

    1.概述 Kafka的使用场景非常广泛,一些实时流数据业务场景,均依赖Kafka来做数据分流.而在分布式应用场景中,数据迁移是一个比较常见的问题.关于Kafka集群数据如何迁移,今天笔者将为大家详细介 ...

  3. window环境下使用filezilla server搭建ftp服务器

    前言 在做项目的时候,需要提供ftp服务,开始的时候使用微软自动的iss上的ftp服务,一段时间后发现无法自定义用户,只能使用系统的用户,使用起来很不方便,在权限管理方面也是不太好.所以换用了file ...

  4. Hbase给初学者的“下马威”

    自从成为架构师()之后,李大胖的学习动力似乎少了一些,尤其是今年(当然也有一些客观因素). 临近岁末,内心着实有些惭愧,决定学习一把大数据.跟随一下业界前沿(其实已经不是前沿了),梦想着有一天能够拥有 ...

  5. [十八]JavaIO之FileReader 和 FileWriter

    简介 FileReader FileWriter 都是提供操作文件的便捷类 这两个类的实现非常的简单 原理 回忆下之前的InputStreamReader和OutputStreamWriter Inp ...

  6. WPF 语言格式化文本控件

    前言 本章讲述正确添加语言资源的方式,以及一段语言资源的多种样式显示. 例如:“@Winter,你好!感谢已使用软件 800 天!” 在添加如上多语言资源项时,“XX,你好!感谢已使用软件 X 天!” ...

  7. Java开发笔记(十五)短路逻辑运算的优势

    前面提到逻辑运算只能操作布尔变量,这其实是不严谨的,因为经过Java编程实现,会发现“&”.“|”.“^”这几个逻辑符号竟然可以对数字进行运算.譬如下面的代码就直接对数字分别开展了“与”.“或 ...

  8. Java开发笔记(三十一)字符类型的表达

    前面介绍的Java编程,要么是与数字有关的计算,要么是与逻辑有关的推理,充其量只能实现计算器和状态机.若想让Java运用于更广阔的业务领域,就得使其支撑更加血肉丰满的业务场景,而丰满的前提是能够表达大 ...

  9. 解决echarts饼图不显示数据为0的数据

    如图所示 饼图数据为0但是还是会显示lableline和lable 解决方法 var echartData = [{ value: data_arry[0]==0?null:data_arry[0], ...

  10. 记录 FTPClient 超时处理的相关问题

    apache 有个开源库:commons-net,这个开源库中包括了各种基础的网络工具类,我使用了这个开源库中的 FTP 工具. 但碰到一些问题,并不是说是开源库的 bug,可能锅得算在产品头上吧,各 ...