[bzoj1598][Usaco08Mar]牛跑步_A*_Dijkstra
牛跑步 bzoj-1598
题目大意:给你n个点,m条边的有向图。求从1到n的严格的第k短路。
注释:$1\le n\le 1000$,$1\le m \le 10,000$,$1\le k \le 100$。
想法:
A*:俗称机器人走路算法。就是说从一个点走到另一个点的最短路径,显然可以bfs。我们可以在bfs时设立估价函数来判断queue中先取出那个点。
比如说这道题,我们先将所有边存起来,先都连反向边。然后从n节点开始跑一遍堆优化dij表示这个点到n的最短路。然后我们从1号节点开始bfs。我们将所有遍历到的节点扔进堆,堆中的估价函数是从源点到当前状态的长度dis加上从当前节点到n的最短路。这样的话,第一个到的点一定是最短路,第二个同理,以此类推,知道我们在n节点已经接收到了k个不同的值,break输出答案即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stdlib.h>
#define N 100010
using namespace std;
int ans[N];
int tot,head[N],to[N],nxt[N],val[N];
int H[N];
struct Node
{
int dis,id;
Node(){}
Node(int dis_,int id_):dis(dis_),id(id_){}
inline bool operator < (const Node &x) const
{
return dis+H[id]>x.dis+H[x.id];
}
};
priority_queue<Node> q;
priority_queue<pair<int,int> >Q;
bool v[N];
inline void add(int x,int y,int z)
{
to[++tot]=y;
val[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
int x[N],y[N],z[N];
int n;
bool vis[N];
void Dij()
{
memset(H,0x3f,sizeof H);
memset(vis,0,sizeof vis);
H[n]=0;
Q.push(make_pair(0,n));
while(!Q.empty())
{
int a=Q.top().second;
Q.pop();
if(vis[a]) continue;
vis[a]=1;
for(int i=head[a];i;i=nxt[i])
{
if(H[to[i]]>H[a]+val[i])
{
H[to[i]]=H[a]+val[i];
Q.push(make_pair(-H[to[i]],to[i]));
}
}
}
}
int cnt=0;
void A_xing(int num)
{
q.push(Node(0,1));
while(!q.empty())
{
Node t=q.top();
q.pop();
int a=t.id;
int distance=t.dis;
if(a==n)
{
ans[++cnt]=distance;
// puts("Fuck");
}
if(cnt==num) return;
for(int i=head[a];i;i=nxt[i])
{
int w=distance+val[i];
/*if(!mp.count(make_pair(w,to[i])))
{
mp[make_pair(w,to[i])]=1;
q2.push(node(w,to[i]));
}*/
q.push(Node(w,to[i]));
}
}
}
int main()
{
int r,k;
scanf("%d%d%d",&n,&r,&k);
for(int i=1;i<=r;i++)
{
scanf("%d%d%d",&x[i],&y[i],&z[i]);
add(x[i],y[i],z[i]);
}
Dij();
memset(head,0,sizeof head);
tot=0;
for(int i=1;i<=r;i++)
{
add(y[i],x[i],z[i]);
}
// for(int i=1;i<=n;i++)
// {
// printf("%d:%d\n",i,H[i]);
// }
A_xing(k);
for(int i=1;i<=k;i++)
{
if(i<=cnt) printf("%d\n",ans[i]);
else printf("-1\n");
}
return 0;
}
小结:这种毒瘤算法好像少接触为妙。
[bzoj1598][Usaco08Mar]牛跑步_A*_Dijkstra的更多相关文章
- BZOJ_1598_[Usaco2008 Mar]牛跑步_A*
BZOJ_1598_[Usaco2008 Mar]牛跑步_A* Description BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. B ...
- 【BZOJ1598】牛跑步 [A*搜索]
牛跑步 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description BESSIE准备用从牛棚跑到池塘的方 ...
- K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院
A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...
- Bzoj 1598: [Usaco2008 Mar]牛跑步 dijkstra,堆,K短路,A*
1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 427 Solved: 246[Submit][St ...
- bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]
1598: [Usaco2008 Mar]牛跑步 题意:k短路 ~~貌似A*的题目除了x数码就是k短路~~ \[ f(x) = g(x) + h(x) \] \(g(x)\)为到达当前状态实际代价,\ ...
- bzoj 1598: [Usaco2008 Mar]牛跑步 -- 第k短路,A*
1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec Memory Limit: 162 MB Description BESSIE准备用从牛棚跑到池塘的方法来锻炼 ...
- 【BZOJ】1598: [Usaco2008 Mar]牛跑步
[题意]给定有向图,边严格从大编号指向小编号,求前k短路.n<=1000,m<=10000,k<=100. [算法]归并+拓扑排序||A*求第k短路 [题解]因为此题自带拓扑序的特殊 ...
- BZOJ 1598 牛跑步
牛跑步 [问题描述] BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. BESSIE也不想跑得太远,所以她想走最短的路经. 农场上一共有M ...
- BZOJ1598: [Usaco2008 Mar]牛跑步
传送门 K短路,普遍的算法是采用AStar求解,先建立反向边跑一遍dij,或者spfa什么的.跑出反向边的距离就可以看为估价函数中的$h()$.设$dist$为当前已经走过的距离,那么$f(node) ...
随机推荐
- D. Toy Sum(cf)
http://codeforces.com/problemset/problem/405/D 题意:已知集合S={1,2,3......1000000},s=1000000,从集合S中选择n个数,X= ...
- curl 采集的时候遇到60报错怎么办?
1.到https://curl.haxx.se/ca/cacert.pem复制下文本粘贴到文件夹cart.pem 然后把catr.pem放到PHP的bin目录下 2.在php.ini中修改下面这句话, ...
- JavaScript--编程挑战
小伙伴们,请编写"改变颜色"."改变宽高"."隐藏内容"."显示内容"."取消设置"的函数,点击相应 ...
- BZOJ 2946 SA/SAM
思路: 1. 二分+后缀数组 2.SAM //By SiriusRen #include <cstdio> #include <cstring> #include <al ...
- PHP电影小爬虫(2)
学习了别人的爬虫后自己改的一个,算是又回顾了一下php的使用 我们来利用simple_html_dom的采集数据实例,这是一个PHP的库,上手很容易.simple_html_dom 可以很好的帮助我们 ...
- [转]自适应网页设计(Responsive Web Design)
本文转自:http://www.ruanyifeng.com/blog/2012/05/responsive_web_design.html 作者: 阮一峰 日期: 2012年5月 1日 随着3G的普 ...
- 字符串String的理解
1.String是一个final的类型 即不可被继承修改,一经生成不可改变.所以在代码中使用String s = s1 + s2;的时候,执行完之后s所指向的是一个新生成的对象,这里有个地方值得注意 ...
- [Codeforces]Codeforces Round #490 (Div. 3)
Mishka and Contest #pragma comment(linker, "/STACK:102400000,102400000") #ifndef ONLINE_JU ...
- PHP魔术法__set和__get
__set: 在给不可访问属性赋值时,__set() 会被调用.语法如下: public void __set ( string $name , mixed $value ) __get: 读取不可访 ...
- iis设置404错误页,返回500状态码
一般在II6下,设置自定义404错误页时,只需要在错误页中选择自定义的页面,做自己的404页面即可.但是在IIS7.0及以上时,设置完404错误页后,会发现状态码返回的是500,并且可能会引起页面乱码 ...