[USACO Mar08] 牛跑步 --k短路
[USACO Mar08] 牛跑步
Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚.
Bessie也不想跑得太远,所以她想走最短的路经. 农场上一共有M(1<=M<=10,000)条路,每条路连接两个用1..N(1<=N<=1000)标号的地点. 更方便的是,如果X>Y,则地点X的高度大于地点Y的高度. 地点N是Bessie的牛棚;地点1是池塘.
很快, Bessie厌倦了一直走同一条路.所以她想走不同的路,更明确地讲,她想找出K(1<=K<=100)条不同的路经.为了避免过度劳累,她想使这K条路径为最短的K条路径.
请帮助Bessie找出这K条最短路经的长度.你的程序需要读入农场的地图, 一些从Xi到Yi的路径和它们的长度(Xi,Yi,Di). 所有(Xi,Yi,Di)满足(1<=Yi<Xi;Yi<Xi<=N,1<=Di<=1,000,000).
题目名称: cowjog
输入格式:
- 第1行: 3个数: N,M,K
- 第2..M+1行: 第 i+1行包含3个数 Xi,Yi,Di, 表示一条下坡的路.
样例输入 (cowjog.in):
5 8 7 5 4 1 5 3 1 5 2 1 5 1 1 4 3 4 3 1 1 3 2 1 2 1 1
输出格式:
- 第1..K行: 第i行包含第i最短路径的长度,或−1如果这样的路径不存在.如果多条路径有同样的长度,请注意将这些长度逐一列出.
样例输出 (cowjog.out):
1 2 2 3 6 7 -1
输出解释:
路径分别为(5−1),(5−3−1),(5−2−1),(5−3−2−1),(5−4−3−1),(5−4−3−2−1)
1 //0.002s 2 3 #include <queue> 4 #include <cstdio> 5 #include <ctype.h> 6 #include <cstring> 7 #include <algorithm> 8 9 using namespace std; 10 11 const int MAXM=10010; 12 const int MAXN=1010; 13 14 int n,m,k; 15 16 int dis[MAXN]; 17 18 bool vis[MAXN]; 19 20 struct SKT { 21 int v; 22 int dist; 23 bool operator < (const SKT&p) const { 24 return dist+dis[v]>p.dist+dis[p.v]; 25 } 26 }; 27 SKT s; 28 29 struct edge { 30 int to; 31 int next; 32 int val; 33 edge() {} 34 edge(int to,int val,int next):to(to),val(val),next(next){} 35 }; 36 edge e[MAXM<<1],r[MAXM<<1]; 37 38 int head[MAXN],Head[MAXN],tot; 39 40 inline void add(int x,int y,int v) { 41 e[++tot]=edge(y,v,head[x]); 42 r[tot]=edge(x,v,Head[y]); 43 head[x]=Head[y]=tot; 44 } 45 46 inline void read(int&x) { 47 int f=1;register char c=getchar(); 48 for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar()); 49 for(;isdigit(c);x=x*10+c-48,c=getchar()); 50 x=x*f; 51 } 52 53 void SPFA() { 54 queue<int> Q; 55 for(int i=1;i<=n;++i) dis[i]=0x7fffffff; 56 dis[1]=0; 57 vis[1]=true; 58 Q.push(1); 59 while(!Q.empty()) { 60 int now=Q.front(); 61 Q.pop(); 62 vis[now]=false; 63 for(int i=Head[now];i!=-1;i=r[i].next) { 64 int to=r[i].to; 65 if(dis[to]>dis[now]+r[i].val) { 66 dis[to]=dis[now]+r[i].val; 67 if(!vis[to]) Q.push(to),vis[to]=true; 68 } 69 } 70 } 71 return; 72 } 73 74 void Astar() { 75 int ans=0; 76 priority_queue<SKT> Q; 77 s.v=n,s.dist=0; 78 Q.push(s); 79 while(!Q.empty()) { 80 SKT now=Q.top(); 81 Q.pop(); 82 if(now.v==1) { 83 printf("%d\n",now.dist); 84 ++ans; 85 } 86 if(ans==k) return; 87 for(int i=head[now.v];i!=-1;i=e[i].next) { 88 int to=e[i].to; 89 if(to<now.v) { 90 SKT FAKER=now; 91 FAKER.v=to;FAKER.dist=now.dist+e[i].val; 92 Q.push(FAKER); 93 } 94 } 95 } 96 while(ans<k) printf("-1\n"),++ans; 97 return; 98 } 99 100 int hh() { 101 freopen("cowjog.in","r",stdin); 102 freopen("cowjog.out","w",stdout); 103 memset(Head,-1,sizeof Head); 104 memset(head,-1,sizeof head); 105 read(n);read(m);read(k); 106 for(int x,y,z;m--;) { 107 read(x);read(y);read(z); 108 if(x>y) add(x,y,z); 109 } 110 SPFA(); 111 Astar(); 112 return 0; 113 } 114 115 int sb=hh(); 116 int main() {;}
SPFA+A*
1 #include <queue> 2 #include <cstdio> 3 #include <ctype.h> 4 #include <cstring> 5 #include <algorithm> 6 7 using namespace std; 8 9 const int MAXM=10010; 10 const int MAXN=1010; 11 12 int n,m,k; 13 14 int dis[MAXN]; 15 16 bool vis[MAXN]; 17 18 struct SKT { 19 int v,val,h; 20 int dist; 21 SKT() {} 22 SKT(int v,int dist):v(v),dist(dist) {} 23 SKT(int x,int y,int z) { 24 v=x;val=y;h=z; 25 dist=val+h; 26 } 27 bool operator < (const SKT&p) const { 28 return dist>p.dist; 29 } 30 }; 31 SKT s; 32 33 struct edge { 34 int to; 35 int next; 36 int val; 37 edge() {} 38 edge(int to,int val,int next):to(to),val(val),next(next){} 39 }; 40 edge e[MAXM<<1],r[MAXM<<1]; 41 42 int head[MAXN],Head[MAXN],tot; 43 44 inline void add(int x,int y,int v) { 45 e[++tot]=edge(y,v,head[x]); 46 r[tot]=edge(x,v,Head[y]); 47 head[x]=Head[y]=tot; 48 } 49 50 inline void read(int&x) { 51 int f=1;register char c=getchar(); 52 for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar()); 53 for(;isdigit(c);x=x*10+c-48,c=getchar()); 54 x=x*f; 55 } 56 57 void Dijs() { 58 priority_queue<SKT> Q; 59 for(int i=1;i<=n;++i) dis[i]=0x3f3f3f3f; 60 Q.push(SKT(1,0)); 61 dis[1]=0; 62 while(!Q.empty()) { 63 SKT now=Q.top(); 64 Q.pop(); 65 for(int i=Head[now.v];i!=-1;i=r[i].next) { 66 int to=r[i].to; 67 if(dis[to]>dis[now.v]+r[i].val) { 68 dis[to]=dis[now.v]+r[i].val; 69 Q.push(SKT(to,dis[to])); 70 } 71 } 72 } 73 return; 74 } 75 76 void Astar() { 77 int ans=0; 78 priority_queue<SKT> Q; 79 s.v=n,s.dist=0; 80 Q.push(s); 81 while(!Q.empty()) { 82 SKT now=Q.top(); 83 Q.pop(); 84 if(now.v==1) {printf("%d\n",now.dist);++ans;} 85 if(ans==k) return; 86 for(int i=head[now.v];i!=-1;i=e[i].next) 87 Q.push(SKT(e[i].to,now.val+e[i].val,dis[e[i].to])); 88 } 89 while(ans<k) printf("-1\n"),++ans; 90 return; 91 } 92 93 int hh() { 94 freopen("cowjog.in","r",stdin); 95 freopen("cowjog.out","w",stdout); 96 memset(Head,-1,sizeof Head); 97 memset(head,-1,sizeof head); 98 read(n);read(m);read(k); 99 for(int x,y,z;m--;) { 100 read(x);read(y);read(z); 101 add(x,y,z); 102 } 103 Dijs(); 104 Astar(); 105 return 0; 106 } 107 108 int sb=hh(); 109 int main() {;}
Dijs+A*
转载于:https://www.cnblogs.com/whistle13326/p/7416392.html
[USACO Mar08] 牛跑步 --k短路相关推荐
- bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]
1598: [Usaco2008 Mar]牛跑步 题意:k短路 ~~貌似A*的题目除了x数码就是k短路~~ \[ f(x) = g(x) + h(x) \] \(g(x)\)为到达当前状态实际代价,\ ...
- 【USACO Mar08】 奶牛跑步 A-star k短路
Description Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚. Bessie也不想跑得太远,所以她想走最短的路经. 农场上一共有M( ...
- k短路(HDU6705)
题目链接:Path 这不是求k短路吗?那直接A算法.仔细一看起点不固定.那A算法是行不通了. 考虑BFS搜索. 这提和牛客多校的一道求第k小团的题很像(思想很像). Kth Minimum Cliqu ...
- [USACO Mar08] 游荡的奶牛
[USACO Mar08] 游荡的奶牛 时间限制:1 s 内存限制:128 MB 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游 ...
- HDU6181(K短路问题)
不知道为什么这个一直爆内存! #include<iostream> #include<algorithm> #include<cmath> #include< ...
- poj2449(k短路算法)
K 短路问题(A* 启发式广搜) 1.k 短路问题就是最短路问题的延申,要找出第 k 短的路径.用广搜进行路径查找,第一次找到的 就是最短路,第二次找到的是第 2 短 路⋯以此类推.所以我们只需要一直 ...
- POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解
题意:找出第k短路,输出长度,没有输出-1 思路:这题可以用A*做.A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h ...
- 第K短路模板【POJ2449 / 洛谷2483 / BZOJ1975 / HDU6181】
1.到底如何求k短路的? 我们考虑,要求k短路,要先求出最短路/次短路/第三短路--/第(k-1)短路,然后访问到第k短路. 接下来的方法就是如此操作的. 2.f(x)的意义? 我们得到的f(x)更小 ...
- BZOJ1975 [Sdoi2010]魔法猪学院 k短路
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1975 题意概括 给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数. ...
最新文章
- Windows中的虚拟内存
- Set、Map、和WeakSet、WeakMap
- golang 下划线
- 谈谈数据库中MyISAM与InnoDB区别
- 江苏省高中计算机课程标准,教育部普通高中信息技术课程标准
- session和cache的区别
- 我的学习JavaEE路线
- 使用mit协议的编程语言_从使用诺基亚功能手机进行编程到如何为MIT初创公司工作的过程如何
- php ajax ip,php / ajax REMOTE_ADDR设置为伪网络适配器的IP
- favicon.ico 404的问题(title栏前面的图标)
- linux内核变更导致的错误及解决方案1
- js深入研究之神奇的匿名函数类生成方式
- 水很深的深度学习-Task01深度学习概述与数学基础
- Hive数仓基本概念介绍
- c++11 多线程编程(五)------unique_lock
- 点击一下就射击的java代码_Java面向对象(6) —— 射击小游戏
- 关于FL Studio ASIO驱动不工作的一个解决方案
- python控制小爱同学_GitHub - xinruoyusixian/Blinker-for-xiaoai: 基于micopython 的小爱同学的代码...
- 小学最简单的计算机微课PPT,小学音乐微课课件
- android 新浪微博第三方登录,Android的集成新浪微博第三方登录