[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短路相关推荐

  1. bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]

    1598: [Usaco2008 Mar]牛跑步 题意:k短路 ~~貌似A*的题目除了x数码就是k短路~~ \[ f(x) = g(x) + h(x) \] \(g(x)\)为到达当前状态实际代价,\ ...

  2. 【USACO Mar08】 奶牛跑步 A-star k短路

    Description Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚. Bessie也不想跑得太远,所以她想走最短的路经. 农场上一共有M( ...

  3. k短路(HDU6705)

    题目链接:Path 这不是求k短路吗?那直接A算法.仔细一看起点不固定.那A算法是行不通了. 考虑BFS搜索. 这提和牛客多校的一道求第k小团的题很像(思想很像). Kth Minimum Cliqu ...

  4. [USACO Mar08] 游荡的奶牛

    [USACO Mar08] 游荡的奶牛 时间限制:1 s 内存限制:128 MB 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游 ...

  5. HDU6181(K短路问题)

    不知道为什么这个一直爆内存! #include<iostream> #include<algorithm> #include<cmath> #include< ...

  6. poj2449(k短路算法)

    K 短路问题(A* 启发式广搜) 1.k 短路问题就是最短路问题的延申,要找出第 k 短的路径.用广搜进行路径查找,第一次找到的 就是最短路,第二次找到的是第 2 短 路⋯以此类推.所以我们只需要一直 ...

  7. POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解

    题意:找出第k短路,输出长度,没有输出-1 思路:这题可以用A*做.A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h ...

  8. 第K短路模板【POJ2449 / 洛谷2483 / BZOJ1975 / HDU6181】

    1.到底如何求k短路的? 我们考虑,要求k短路,要先求出最短路/次短路/第三短路--/第(k-1)短路,然后访问到第k短路. 接下来的方法就是如此操作的. 2.f(x)的意义? 我们得到的f(x)更小 ...

  9. BZOJ1975 [Sdoi2010]魔法猪学院 k短路

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1975 题意概括 给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数. ...

最新文章

  1. Windows中的虚拟内存
  2. Set、Map、和WeakSet、WeakMap
  3. golang 下划线
  4. 谈谈数据库中MyISAM与InnoDB区别
  5. 江苏省高中计算机课程标准,教育部普通高中信息技术课程标准
  6. session和cache的区别
  7. 我的学习JavaEE路线
  8. 使用mit协议的编程语言_从使用诺基亚功能手机进行编程到如何为MIT初创公司工作的过程如何
  9. php ajax ip,php / ajax REMOTE_ADDR设置为伪网络适配器的IP
  10. favicon.ico 404的问题(title栏前面的图标)
  11. linux内核变更导致的错误及解决方案1
  12. js深入研究之神奇的匿名函数类生成方式
  13. 水很深的深度学习-Task01深度学习概述与数学基础
  14. Hive数仓基本概念介绍
  15. c++11 多线程编程(五)------unique_lock
  16. 点击一下就射击的java代码_Java面向对象(6) —— 射击小游戏
  17. 关于FL Studio ASIO驱动不工作的一个解决方案
  18. python控制小爱同学_GitHub - xinruoyusixian/Blinker-for-xiaoai: 基于micopython 的小爱同学的代码...
  19. 小学最简单的计算机微课PPT,小学音乐微课课件
  20. android 新浪微博第三方登录,Android的集成新浪微博第三方登录

热门文章

  1. Cordova/Ionic Android 开发环境搭建 - Windows系统
  2. 【代码笔记】Web-CSS-CSS 链接(link)
  3. 【spring源码分析】IOC容器初始化(二)
  4. binary_sort 二叉树
  5. 在WPF的WebBrowser控件中抑制脚本错误
  6. 如何在IE右键菜单中添加自定义项
  7. rds_dbsync数据源同步工具
  8. Python自动化开发学习22-Django上
  9. Android 源代码自动编译packages/apps
  10. 使用Android高性能音频--OpenSL ES和AAudio