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 ...
随机推荐
- 在xaf 14 中实现 Tonyyang原文中的action权限
具体实现过程,主要修改了以下几个地方: 第一:角色和用户类中需要修改成SecurityStrategy的方式: 具体代码 MySecurityRole: using System; using Sys ...
- CSS text-transform 属性
text-transform 属性控制文本的大小写. h1 {text-transform:uppercase} h2 {text-transform:capitalize} p {text-tran ...
- 控制input标签中只能输入数字以及小数点后两位
js 代码如下: /* 控制input标签中只能输入数字 和小数点后两位 */ function checkNum(obj) { //检查是否是非数字值 if (isNaN(obj.value)) { ...
- 利用matlab摄像机标定
(1)输入图像 "Image names"键 Matlab的图形窗口显示出20幅靶标图像 (2) 提取角点 "Extract grid corners"键. 输 ...
- Oracle RMAN 恢复控制文件到指定的路径
Oracle 数据库通过RMAN恢复控制文件到指定的路径 --------------------------------------------------------- 先查询备份集信息,再指定备 ...
- 深入理解display属性
display 属性在网页布局中很常见,但是之前一直不了解他的各个属性的区别,只是简单的使用block.none属性,对于其他属性都不清楚,今天详细的学习和实践display属性的各个方面 定义 di ...
- 深入理解Java虚拟机(二)、Java对象的创建,内存布局和访问定位
对象的创建: Object obj = new Object(); 常量池中是否有Ljava.lang.Object
- Quarter square 查找表乘法器,手动建立rom
建立一个C的范围为0~255,内容是(C)2/4的查表 占用256个存储空间,但可以计算出+-127的两个数之积.传统算法需要至少127×127个存储空间. 查找表模块的建立: module lut_ ...
- 默认构造方法并非总是public的
以前印象中一直有一个概念,说"如果没有提供构造方法,java将自动添加一个空的public的构造方法".现在看来,有2个问题,一,默认构造方法未必是public的,二,默认构造方法 ...
- android图片的scaleType属性
scaleType 保持图片原有大小 scaleType="fitXY"填满盒子 scaleType="fitStart"保持纵横比缩放放在左上角 scaleT ...