K最短路 A*算法
#include <iostream>
#include <algorithm>
#include <queue>
#include <stdio.h>
using namespace std;
int m,n,s,t,k;
#define M 100005
#define N 1005
#define INF 100000000
int dis[N];
struct edge
{
int v,val,next;//边的终点,边权
edge(){}
edge(int _v,int _val,int _next){v=_v,val=_val,next=_next;}
}line[M],_line[M];
int head[M],_head[M]; struct dijnode
{
int v,dis;
dijnode(){}
dijnode(int _v,int _dis){v=_v,dis=_dis;}
friend bool operator <(const dijnode &a,const dijnode &b)
{
return a.dis>b.dis;
}
};
struct Anode
{
int v,g,h;//v:当前点 g:起点到点v距离 h:点v到终点距离
Anode(){}
Anode(int _v,int _g,int _h){v=_v,g=_g;h=_h;}
friend bool operator <(const Anode&a,const Anode&b)
{
return a.h+a.g>b.h+b.g;
}
};
void input(){
memset(head,-,sizeof(head));
memset(_head,-,sizeof(_head));
int u,v,val;
int e=,_e=;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&u,&v,&val);
line[e]=edge(v,val,head[u]);
head[u]=e++;
_line[_e]=edge(u,val,head[v]);
_head[v]=_e++;
}
}
int vis[N];
void dijkstra()
{
memset(vis,,sizeof(vis));
priority_queue<dijnode>pq;
for(int i=;i<n;i++)
dis[i]=INF; dijnode node =dijnode(t,);
dis[t]=;
pq.push(node); while(!pq.empty())
{
dijnode tmp = pq.top();
pq.pop(); if(vis[tmp.v])continue;
vis[tmp.v]=;
for(int i=_head[tmp.v];i!=-;i=_line[i].next)
{
if(tmp.dis+_line[i].val<dis[_line[i].v])
{
dis[_line[i].v]=tmp.dis+_line[i].val;
pq.push(dijnode(_line[i].v,dis[_line[i].v]));
}
}
}
for(int i=;i<=n;i++)printf("%d\n",dis[i]); }
int kcnt[N];
int Astar()
{
if(dis[s]>=INF)return -;
memset(kcnt,,sizeof(kcnt));
priority_queue<Anode> pq;
pq.push(Anode(s,,dis[s]));
Anode node;
while(!pq.empty())
{
node = pq.top();
pq.pop();
if(kcnt[node.v]>=k)continue; kcnt[node.v]++;
if(kcnt[t]>=k)return node.g;
for(int i=head[node.v];i!=-;i = line[i].next)
{
pq.push(Anode(line[i].v,node.g+line[i].val,dis[line[i].v]));
}
}
return -; }
int main(int argc, const char * argv[])
{ while(scanf("%d%d",&n,&m)!=EOF)
{
input();
scanf("%d%d%d",&s,&t,&k);
dijkstra();
printf("%d\n",Astar());
}
}
K最短路 A*算法的更多相关文章
- POJ 2449 Remmarguts' Date (K短路 A*算法)
题目链接 Description "Good man never makes girls wait or breaks an appointment!" said the mand ...
- POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )
题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...
- 单源最短路dijkstra算法&&优化史
一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...
- Remmarguts' Date(POJ2449+最短路+A*算法)
题目链接:http://poj.org/problem?id=2449 题目: 题意:求有向图两点间的k短路. 思路:最短路+A*算法 代码实现如下: #include <set> #in ...
- 最短路Dijkstra算法的一些扩展问题
最短路Dijkstra算法的一些扩展问题 很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...
- 【ACM程序设计】求短路 Floyd算法
最短路 floyd算法 floyd是一个基于贪心思维和动态规划思维的计算所有点到所有点的最短距离的算法. P57-图-8.Floyd算法_哔哩哔哩_bilibili 对于每个顶点v,和任一顶点对(i, ...
- LC T668笔记 & 有关二分查找、第K小数、BFPRT算法
LC T668笔记 [涉及知识:二分查找.第K小数.BFPRT算法] [以下内容仅为本人在做题学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] !! ...
- 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院
Description 找出1~k短路的长度. Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...
- K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院
A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...
随机推荐
- Highchart URL
http://www.highcharts.com/stock/demo/flags-general http://www.codesec.net/view/217265.html http://js ...
- JavaScript数组的一些方法集合
数组方法集合 push()添加到数组末尾,并返回修改后数组的长度 var a=array.push('a','b'); alert(a);//2 pop() 移除数组最后一项,返回移除的项. shif ...
- 深入理解display属性
display 属性在网页布局中很常见,但是之前一直不了解他的各个属性的区别,只是简单的使用block.none属性,对于其他属性都不清楚,今天详细的学习和实践display属性的各个方面 定义 di ...
- HashMap学习
HashMap<String, Object> java.util.HashMap<String, Object> 在数组中我们是通过数组下标来对其内容索引的,而在Map中 ...
- 分享一个快速测试ios软件的工具
简易IPA安装地址生成器 地址: https://www.neicexia.com/IPADistribute/Resources/index.html?fromsite#IPADistribute- ...
- sublime插件 TortioseSVN
TortioseSVN 可以安装在sublime中,实现svn文件的增加.删除.更新.提交等功能(TortioseSVN用在window系统中,linux安装svn) 安装: 首先在sublime中搜 ...
- Cordova系列(一)
1.安装 这里推荐用npm安装cordova,至于npm的安装,网上有很多的.打开命令行,输入 npm install -g cordova 这里就安装了好了最新版的cordova,虽然绝大多数会成功 ...
- 《笨办法学C》笔记之指针
C语言编程主要操作的对象就是指针. 指针从哪里来 指针就是表示内存存储区域的一组数值,使用%p格式化字符串. Linux系统会为程序维护两个临时变量存储位置:栈.堆.栈的空间少,栈通常在用户更高的地址 ...
- Maven + Eclipse + Tomcat - 开启项目调试之旅(转)
本文的读者需要拥有一些Maven基础知识和实践,如果没有,请直接绕过或者先看一些关于Maven教程,比如Juven翻译的<Maven权威指南>,google一下便知. 开门见山,首先抛出一 ...
- 【Mail】邮件的基础知识和原理
电子邮件概念 电子邮件是-种用电子手段提供信息交换的通信方式,是互联网应用最广的服务.通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费).非常快速的方式(几秒钟之内可以 ...