[USACO Mar08] 牛跑步 --k短路

Posted 心之所向 素履以往

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO Mar08] 牛跑步 --k短路相关的知识,希望对你有一定的参考价值。

                                            [USACO Mar08] 牛跑步

 

Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚.

Bessie也不想跑得太远,所以她想走最短的路经. 农场上一共有M(1<=M<=10,000)条路,每条路连接两个用1..N(1<=N<=1000)标号的地点. 更方便的是,如果X>Y,则地点X的高度大于地点Y的高度. 地点NBessie的牛棚;地点1是池塘.

很快, Bessie厌倦了一直走同一条路.所以她想走不同的路,更明确地讲,她想找出K(1<=K<=100)条不同的路经.为了避免过度劳累,她想使这K条路径为最短的K条路径.

请帮助Bessie找出这K条最短路经的长度.你的程序需要读入农场的地图, 一些从XiYi的路径和它们的长度(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

输出解释:

路径分别为(51),(531),(521),(5321),(5431),(54321)

 

技术分享
  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*

 

以上是关于[USACO Mar08] 牛跑步 --k短路的主要内容,如果未能解决你的问题,请参考以下文章

COGS 133. [USACO Mar08] 牛跑步

cogs 133. [USACO Mar08] 牛跑步 A*算法

bzoj 1598: [Usaco2008 Mar]牛跑步 -- 第k短路,A*

BZOJ_1598_[Usaco2008 Mar]牛跑步_A*

BZOJ 1598: [Usaco2008 Mar]牛跑步

bzoj1598: [Usaco2008 Mar]牛跑步