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. js写弹窗

    1.先来看弹窗的模样 点击“弹出窗口”后会弹出下面窗口 2.下面是实现弹出窗口的代码,其中引入的jquery一般自己有,没有的话可以从网上下载.tanchuang.js和tanchuang.css写在 ...

  2. 快速入门react

    安装react npm install creat-react-app -g这里直接安装react的一个脚手架,里面包含了要用到的许多东西,帮助快速入门react 创建新项目 create-react ...

  3. callee与caller

    1.callee arguments.callee表示当前函数,使用于递归 function factorial(num){ if(num<=1){ return 1; }else{ retur ...

  4. python基本数据类型list,tuple,set,dict用法以及遍历方法

    1.list类型 类似于java的list类型,数据集合,可以追加元素与删除元素. 遍历list可以用下标进行遍历,也可以用迭代器遍历list集合 建立list的时候用[]括号 import sys ...

  5. shell将多行文本重定向到文件【转】

    在shell中,使用Here Document方式将文本重定向到文件,格式如下: ( cat << EOF 要写的文本 EOF ) > 目标文件 示例test.sh: #! /bin ...

  6. nginx 各种配置

    first : mkdir /usr/local/nginx/conf/vhosts{网站配置}/usr/local/nginx/conf/vhosts/test.conf : server { li ...

  7. TypeError: not all arguments converted during string formatting

    print ("So, you're 5r old, %r tall and %r heavy." % (age, height, weight)) print ("So ...

  8. IntelliJ IDEA 创建maven项目一次后,然后删除,再次保存到此目录下,提供此目录已经被占用的问题。

    -------------------2017-02-14补充: 你看既然是创建过一次 不允许再次创建了,那么请问 第一次创建的 跑哪里去了,不仅仅是保存到了你指定的目录里,其实也默认安装到了 mav ...

  9. **CodeIgniter通过hook的方式实现简单的权限控制

    根据自己的实际情况,需要两个文件,一个是权限控制类,Acl,另外一个是权限配置的文件acl.php放在了config这个目录下. Acl这个类放在了application/hook/acl.php.通 ...

  10. python开发学习-day05(正则深入、冒泡排序算法、自定义模块、常用标准模块)

    s12-20160130-day05 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...