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 ...
随机推荐
- JsonString,字典,模型之间相互转换
NSData转字符串 [NSString alloc] initWithData: encoding:] 模型转字典 attInfo.keyValues 字典转模型 ZTEOutputInfo *ou ...
- NSArray转json字符串
func arrayToJson(arr:NSArray) -> String { let jsonData: NSData = try! NSJSONSerialization.dataWit ...
- SQL注入的原理以及危害
SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符 ...
- Spring Framework 笔记(一):IoC
一:Spring中重要的概念 1. 容器( container ) : spring容器( ApplicationContext )的工作原则是创建容器中的组件( instance ),处理组件之间的 ...
- 初窥Kaggle竞赛
初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...
- 根据第三方库spire.pdf使用指定打印机打印pdf文件
private void button1_Click(object sender, EventArgs e) { PdfDocument doc = new PdfDocument(); string ...
- 过滤Xss
/** * 防xss过滤 * * @author rentingshuang <tingshuang@rrkd.cn> * @param type $string * @param typ ...
- NC 解决启动环境报内存溢出问题
java heap space 内存溢出 解决方法如下: 在eclipse中,window-->preferences-->Java-->Installed JREs选中JRE 点击 ...
- Javascript 处理时间大全
1. 获取从今天算起,几天后的日期 function GetDateStr(AddDayCount) { var dd = new Date(); dd.setDate(dd.getDate() + ...
- jdk1.8下载安装
jdk8环境变量 jdk8图解安装 java8安装 1 2 3 4 5 6 7 分步阅读 JDK8 是JDK的最新版本,加入了很多新特性,如果我们要使用,需要下载安装: JDK8在windows ...