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 ...
随机推荐
- windows无法停用“Android Composite Interface”设备的解决方法
遇到这个问题时,解决方法如下: 打开设备管理器 -> 进程 -> 找到 adb.exe -> 右击选择结束进程 -> 然后重新弹出Android设备
- jquery each遍历节点使用
---恢复内容开始--- $("#aaa :input[type='text']").each(function(i){ alert(this.value); this.v ...
- jQuery.cookie.js插件了解及使用方法
jquery.cookie.js插件实现浏览器的cookie存储,该插件是基于jquery开发,方便cookie使用. jquerycookie.js的下载地址 http://plugins.jque ...
- Git之VS2010实践
对于我们经常在VS2010下编程的开发人员来说,强大的SCM工具Git貌似对我们很陌生.对于Git,我在我的另一篇博客<Git学习笔记>中已做过介绍,下面我再简单介绍一下Git在VS201 ...
- ExtJs知识点概述
1.前言 ExtJS的前身是YUI(Yahoo User Interface).经过不断的发展与改进,ExtJS现在已经成功发布到了ExtJS 6版本,是一套目前最完整和最成熟的javascript基 ...
- 学习总结relative和absolute
之前对于absolute和relative不了解,现在整理 先设置relative再设置absolute 因为父不设置relative 那么子会向上寻找祖先元素,看是否设置relative.如果有则相 ...
- Python赋值语句与深拷贝、浅拷贝的区别
参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...
- 百度贴吧python吧抓取用户名和图片
原理就是将贴吧条数中的用户提取出来并在此爬取用户中的图片 #!/usr/bin/env python #coding:utf-8 import requests import urllib2 impo ...
- Mac OS X 访问 Windows 共享文件夹
Mac OS X 访问 Windows 共享文件夹 mac没有网络邻居,但可以使用finder访问局域网中windows共享的文件 1.点击 Finder 前往菜单中的「前往服务器」(或快捷键 com ...
- ARP包分析(wireshark)
ARP数据报格式(42字节) 这是用wireshark抓到的一个ARP包,42个字节. 这个ARP包的 以太网首部(14字节): 字段 长度(Byte) ...