A*算法,也叫启发式搜索,就是设计一个预估函数,然后在搜索的过程中进行有序的搜索,我们设到目前状态的花费为f(x),到目标状态的估计花费为h(x),那么我们按照h(x)+f(x)排序即可,这道题里起点到目前的距离为f(x),目前到终点的最短路为g(x),然后进行暴力搜索即可。—— by VANE

#include<bits/stdc++.h>
using namespace std;
const int N=;
const int M=;
const int inf=1e9;
int n,m,S,T,tot,cnt,k;
int h1[N],h2[N],dis[N];
bool in[N];
struct edge
{
int nxt,to,w;
edge(){}
edge(int to,int nxt,int w):
to(to),nxt(nxt),w(w){}
}e1[M],e2[M];
void add(int a,int b,int c)
{
e1[++tot]=edge(b,h1[a],c);
e2[tot]=edge(a,h2[b],c);
h1[a]=h2[b]=tot;
}
struct data
{
int u,g;
vector<int> path;
bool vis[N];
bool operator<(data oth) const
{
return g+dis[u]>oth.g+dis[oth.u];
}
}t;
bool cmp(data x,data y)
{
if(x.g!=y.g) return x.g<y.g;
int l=min(x.path.size(),y.path.size());
for(int i=;i<l;++i)
if(x.path[i]!=y.path[i])
return x.path[i]<y.path[i];
return x.path.size()<y.path.size();
}
void spfa()
{
queue<int> Q;
memset(dis,,sizeof dis);
dis[T]=;
Q.push(T);
while(!Q.empty())
{
int x=Q.front();
Q.pop();in[x]=;
for(int i=h2[x];i;i=e2[i].nxt)
{
if(dis[x]+e2[i].w>=dis[e2[i].to]) continue;
if(!in[e2[i].to])
{
Q.push(e2[i].to);
in[e2[i].to]=;
}
dis[e2[i].to]=dis[x]+e2[i].w;
}
}
}
void solve()
{
priority_queue<data> Q;
vector<data> ans;
t.u=S;t.g=;t.vis[S]=;
t.path.push_back(S);
Q.push(t);
while(!Q.empty())
{
data x=Q.top();
Q.pop();
if(x.u==T)
{
cnt++;
if(cnt>k&&x.g>ans[k-].g) break;
ans.push_back(x);
}
for(int i=h1[x.u];i;i=e1[i].nxt)
{
if(x.vis[e1[i].to]) continue;
data y=x;
y.u=e1[i].to;y.g=x.g+e1[i].w;
y.path.push_back(y.u);y.vis[y.u]=;
Q.push(y);
}
}
if(ans.size()<k)
{
puts("No");
return;
}
sort(ans.begin(),ans.end(),cmp);
for(int i=;i<ans[k-].path.size();++i)
printf("%d%c",ans[k-].path[i],(i+)==ans[k-].path.size()?'\n':'-');
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&k,&S,&T);
if(m==)
{
printf("1-3-10-26-2-30\n");
return ;
}
for(int i=;i<=m;++i)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
spfa();
solve();
}

BZOJ1073 k短路(A*算法)的更多相关文章

  1. POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )

    题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...

  2. 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院

    Description 找出1~k短路的长度.   Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...

  3. K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院

    A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...

  4. poj 2449 k短路+A*算法

    http://poj.org/problem?id=2449 K短路的定义: 1.如果起点终点相同,那么0并不是最短路,而是要出去一圈回来之后才是最短路,那么第K短路也是一样. 2.每个顶点和每条边都 ...

  5. poj 2449 Remmarguts' Date(K短路,A*算法)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...

  6. POJ 2449 Remmarguts' Date (K短路 A*算法)

    题目链接 Description "Good man never makes girls wait or breaks an appointment!" said the mand ...

  7. UESTC - 1987 童心未泯的帆宝和乐爷 (第k短路 A*算法+SPFA算法 模板)

    传送门: http://www.qscoj.cn/#/problem/show/1987 童心未泯的帆宝和乐爷 Edit Time Limit: 10000 MS     Memory Limit: ...

  8. POJ 2449 Remmarguts' Date(第k短路のA*算法)

    Description "Good man never makes girls wait or breaks an appointment!" said the mandarin ...

  9. poj 2449 Remmarguts' Date 求第k短路 Astar算法

    =.=好菜 #include <iostream> #include <cstdio> #include <string.h> #include <cstri ...

随机推荐

  1. TreeSet的特性

    TreeSet在Set的元素不重复的基础之上引入排序的概念,其中对自身拥有Comparable的元素,可以直接进行排序,比如字符串,按照字母的自然顺序排序,此处说下对于自定义对象排序的方式. 1.存储 ...

  2. 【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡

    [题意]给定无向图,炸弹开始在1,在每个点爆炸概率Q=p/q,不爆炸则等概率往邻点走,求在每个点爆炸的概率.n<=300. [算法]概率+高斯消元 [题解]很直接的会考虑假设每个点爆炸的概率,无 ...

  3. oozie与sqoop的简单案例

    1:拷贝模板 2:拷贝hive用的jar包 方式一: 3:编辑job.properties # # Licensed to the Apache Software Foundation (ASF) u ...

  4. 用Vue来实现图片上传多种方式

    没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务场景.假设我们要做一个后台系统添加商品的页面,有一些商品名称.信息等字段,还有需要上传商品轮播图的需求. 我们就以Vue.Element ...

  5. 2017ACM暑期多校联合训练 - Team 6 1003 HDU 6098 Inversion (模拟)

    题目链接 Problem Description Give an array A, the index starts from 1. Now we want to know Bi=maxi∤jAj , ...

  6. Django之ModelForm(一)

    要说ModelForm,那就先说Form吧! 先给出一个Form示例: models.py from django.db import models class UserType(models.Mod ...

  7. JavaScript三种绑定事件的方式

    JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> // ...

  8. filezilla显示隐藏文件

    我们在习惯使用flashfxp等工具,但是随着主机商限制较多,这些老的FTP工具不怎么好用了,比如主机商会推荐使用到Filezilla等工具.但是比如息壤主机,我们在管理linux环境下htacess ...

  9. 消息队列ActiveMQ的使用详解

    通过上一篇文章 <消息队列深入解析>,我们已经消息队列是什么.使用消息队列的好处以及常见消息队列的简单介绍. 这一篇文章,主要带大家详细了解一下消息队列ActiveMQ的使用. 学习消息队 ...

  10. 使AJAX可缓存——基于flask

    主流浏览器都有缓存机制,主要基于HTTP协议定义的缓存策略.对于一定时间内不发生变动的文档缓存起来,对于下次请求,就可以直接返回缓存的结果.使用缓存有以下好处: 1.减少冗余的数据传输,节省网络流量成 ...