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. TCP/IP 三次握手

    网络连接状态 网络连接状态(11种)非常重要这里既包含三次握手中的也包括四次断开中的,所以要熟悉. LISTEN 被动打开,首先服务器需要打开一个socket进行监听,监听来自远方TCP端口的连接请求 ...

  2. ThreadPoolExecutor系列三——ThreadPoolExecutor 源码解析

    ThreadPoolExecutor 源码解析 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7681826.htm ...

  3. Linux下的C#连接Mysql数据库

    今天在尝试在 Linux 系统下使用C#连接数据库,发现网上这方面的信息很少,所以就写一篇博客记录一下. Linux下这里使用的是mono. 首先是缺少Mysql.Data.dll这个库的,所以需要安 ...

  4. linux centos6.5安装KVM

    1.安装kvm,vnc软件 http://www.server110.com/kvm/201404/10467.html yum install kvm,缺啥补啥 yum install kvm km ...

  5. #12 Python函数

    前言 矩形的面积 S = ab,只要知道任一矩形的的长和宽,就可以带入上式求得面积.这样有什么好处呢?一个公式,适用于全部矩形,一个公式,重复利用,减少了大脑的记忆负担.像这类用变量代替不变量的思想在 ...

  6. 从零开始学安全(三十五)●mysql 盲注手工自定义python脚本

    import requests import string #mysql 手动注入 通用脚本 适用盲注 可以跟具自己的需求更改 def home(): url="url" list ...

  7. C# 给现有PDF文档添加页眉、页脚

    概述 页眉页脚是一篇完整.精致的文档的重要组成部分.在页眉页脚处,可以呈现的内容很多,如公司名称.页码.工作表名.日期.图片,如LOGO.标记等.在之前的文章中介绍了如何通过新建一页空白PDF页来添加 ...

  8. php注册、登录界面的制作

    当初我觉得一个网站上注册和登录这两个功能很神奇,后来自己研究一下发现其实道理很简单,接下来看一下怎么实现的吧.... 我实在我的电脑上建了几个文件: login.html (登录页面) registe ...

  9. Mybatis入门之增删改查

    Mybatis入门之增删改查 Mybatis如果操作成功,但是数据库没有更新那就是得添加事务了.(增删改都要添加)----- 浪费了我40多分钟怀疑人生后来去百度... 导入包: 引入配置文件: sq ...

  10. Sql Server 2008日志满的解决办法

    通过sql命令 USE ZGZY; GO --由完整模式设置为简单恢复模式 ALTER DATABASE ZGZY SET RECOVERY SIMPLE WITH NO_WAIT GO --收缩日志 ...