COGS 133. [USACO Mar08] 牛跑步
2024-09-08 11:48:03
★★★ 输入文件:cowjog.in
输出文件:cowjog.out
简单对比
时间限制:1 s 内存限制:128 MB
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)
k短路模板
#include <cstdio>
#include <queue>
#define N 10500
#define INF 0x7fffffff
using namespace std;
struct Edge
{
int next,to,dis;
};
Edge edge1[N],edge2[N];
bool vis[N];
int n,m,k,head1[N],head2[N],cnt,dis[N];
inline void ins(int u,int v,int w)
{
edge1[++cnt]=(Edge){head1[u],v,w};
head1[u]=cnt;
edge2[cnt]=(Edge){head2[v],u,w};
head2[v]=cnt;
}
void spfa(int s)
{
for(int i=;i<=n;++i) dis[i]=INF;
dis[s]=;
queue<int>q;
q.push(s);
for(int now;!q.empty();)
{
now=q.front();q.pop();
vis[now]=;
for(int i=head2[now];i;i=edge2[i].next)
{
int v=edge2[i].to;
if(dis[v]>dis[now]+edge2[i].dis)
{
dis[v]=dis[now]+edge2[i].dis;
if(!vis[v])
{
vis[v]=;
q.push(v);
}
}
}
}
}
struct node
{
int to,f,g;
bool operator<(node a)const
{
if(f==a.f) return g>a.g;
else return f>a.f;
}
};
void Astar()
{
int cnt=;
priority_queue<node>q;
node a;
a.to=n;
a.g=;
a.f=a.g+dis[a.to];
q.push(a);
for(node now;!q.empty();)
{
now=q.top();q.pop();
if(now.to==) {cnt++;printf("%d\n",now.g);}
if(cnt==k) return;
for(int i=head1[now.to];i;i=edge1[i].next)
{
int v=edge1[i].to;
node tmp;
tmp.to=v;
tmp.g=now.g+edge1[i].dis;
tmp.f=tmp.g+dis[tmp.to];
q.push(tmp);
}
}
for(;cnt<k;) printf("-1\n"),cnt++;
}
int Main()
{
freopen("cowjog.in","r",stdin);
freopen("cowjog.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int x,y,z,i=;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
if(x>y) ins(x,y,z);
}
spfa();
Astar();
return ;
}
int sb=Main();
int main() {;}
最新文章
- GitHub实战系列汇总篇
- excel链接sharepoint 用于 Excel 的 Microsoft Power Query
- Atitit 视频编码与动画原理attilax总结
- iOS应用如何支持IPV6-b
- 令牌桶在数据通信QoS流量监管中的应用
- 从零开始,使用python快速开发web站点(2)
- Call ;to ;undefined ;function ;mssql_connect()错误解决
- 笨方法学python--读文件
- 入门VMware Workstation下的Debian学习之基本命令(二)
- Nodejs.热部署方法
- 基于FPGA的图像显示
- Angular CLI 安装和使用
- 用jQuery写的轮播图
- 二叉树的python可视化和常用操作代码
- cf 1110 D
- 请求headers处理
- js禁止页面滚动
- .net Framework 源代码 &#183; ScrollViewer
- [No0000163]卷福、神秘博士和一群老戏骨表演群口相声:To be or not to be该咋念,简直高潮迭起
- (1.13)mysql优化数据库对象
热门文章
- Spring Boot 2.x(十七):快速入门Elastic Search
- 设置a 标签打开新窗口新姿势
- laravel 报错htmlspecialchars() expects parameter 1 to be string, object given
- css 的继承性
- Tcl/Tk语言学习------拆分字符串
- Elasticsearch学习记录(入门篇)
- mysql项目实战经验
- bzoj1139:[POI2009]Wie
- route(2018.10.24)
- java数据结构----树