牛慢跑

据说是\(k\)短路模板,要用\(A^*\),然而我不会。我是用拓扑排序加堆优化广搜水过去的。第一道完全靠自己做出来的紫题,调了两个小时,交了两遍。果然我还是太菜了。

正解的话,可以看红太阳的博客

题面

给出\(n\)个点\(m\)条边的有向无环图,求从\(n\)到\(1\)的前\(k\)条最短路的值。

\(1≤N≤1000 ,1 <= M <= 10000 ,1≤K≤100\)

输入格式

第\(1\)行:三个以空格分隔的整数:\(N,M\)和\(K\).

第\(2..M + 1\)行:第\(i + 1\)行描述了使用三个以空格分隔的整数的下坡牛路径:\(X_i,Y_i\)和$D_i(1≤Di≤1000000) $

输出格式

行\(1..K\):行\(i\)包含第\(i\)个最短路径的长度,如果不存在这样的路径,则为\(-1\)。如果多次出现最短路径长度,请务必在输出中多次列出。

输入样例

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
2
2
3
6
7
-1

拓扑排序加堆优化广搜

以下是我的神奇做法。

要找前\(k\)条最短路,怎么找?我观察了一下样例的图,发现每个点的路径长度会被更新很多次,但都是由直接指向他的点更新来的(废话),也就是说,他前面的点怎样更新的我不关心,我只关心这个点前\(k\)条最短路的长度。

那直接用堆存一下就好了。

但是我们要保证他前面的点已经更新完了。前面说了这是一个有向无环图,自然想到拓扑排序。

但我之前犯了一个错误,它花费了我一个多小时的时间。这个题要求必须从\(n\)号点出发,但是有些点\(n\)号点到不了,它们一开始入度就为零。如果不把这些点的影响去掉,后面就会出错。果然我菜鸡的本质难以掩盖。

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
long long read(){
long long x=0;int f=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
return f?-x:x;
} int n,m,k;
struct Dier{//前向星
int to,next,w;
}a[10004];
int head[1001],cnt;
void add(int x,int y,int z){//单向边
a[++cnt].to=y,a[cnt].next=head[x],a[cnt].w=z,head[x]=cnt;
} priority_queue<int,vector<int>,greater<int> >q[1005];//小根堆
int in[1001],Q[1001],h,t;
// 入度 队列 int main(){
n=read(),m=read(),k=read();
for(int i=1,x,y,z;i<=m;++i){
x=read(),y=read(),z=read();
add(x,y,z),in[y]++;
} //拓扑
for(int i=n;i;--i)
if(!in[i]) Q[++t]=i;
for(int i=1;i<=t;++i){
if(Q[i]==n) continue;//n号点的影响不应该去掉
int u=Q[i];
for(int i=head[u],v;v=a[i].to,i;i=a[i].next){
in[v]--;
if(!in[v]) Q[++t]=v;//斩草不除根,后面麻烦无穷
//只要不是从n号点直接或间接转移过来的入度都要去掉,因为他们会妨碍我们后面的入队
}
} t=1,Q[1]=n;//初始化一下
q[n].push(0);
while(h<t){//广搜
int u=Q[++h],ls=0;
while(u!=1&&!q[u].empty()&&++ls<=k){//只取前k条就好
//保证1号点的距离不会被pop掉
for(int i=head[u],v;v=a[i].to,i;i=a[i].next)
q[v].push(q[u].top()+a[i].w);//更新距离
q[u].pop();
}
//计算入度一定要独立出来,不能和更新距离放在一起,因为那样会导致入度被减很多次
for(int i=head[u],v;v=a[i].to,i;i=a[i].next){
in[v]--;
if(!in[v]) Q[++t]=v;
}
}
while(!q[1].empty()&&k){//输出答案
printf("%d\n",q[1].top()),q[1].pop(),k--;
}
for(int i=1;i<=k;++i) printf("-1\n");//有可能并没有k条路可以走
return 0;
}

欢迎指正评论O(∩_∩)O~~

【K短路】牛慢跑的更多相关文章

  1. 【Luogu】P2901牛慢跑(K短路模板)

    题目链接 K短路居然用A*……奇妙. 先建反图从终点(1)跑一遍最短路,再A*,用堆存当前点到终点距离+从起点到当前点距离. 每次取出终点都可以视为发现了一个新的最短路. #include<cs ...

  2. Bzoj 1598: [Usaco2008 Mar]牛跑步 dijkstra,堆,K短路,A*

    1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 427  Solved: 246[Submit][St ...

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

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

  4. K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院

    A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...

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

    1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec  Memory Limit: 162 MB Description BESSIE准备用从牛棚跑到池塘的方法来锻炼 ...

  6. bzoj 1598: [Usaco2008 Mar]牛跑步【A*K短路】

    A*K短路模板,详见https://blog.csdn.net/z_mendez/article/details/47057461 算法流程: 把有向图全建成反向边,跑一遍所有点到t的最短路记为dis ...

  7. POJ 2449 Remmarguts' Date --K短路

    题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...

  8. POJ 2449Remmarguts' Date K短路模板 SPFA+A*

    K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...

  9. BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...

随机推荐

  1. Jenkins安装第一个插件和通过离线安装包进行安装

    1.打开左侧Manage Jenkins 选择Manage Plugins菜单 2.搜索Folders插件,该插件用于创建一个目录 3.点击安装进入插件安装状态,Jenkins会自动下载相关联的插件 ...

  2. (译)Kubernetes中的多容器Pod和Pod内容器间通信

    原文:https://www.mirantis.com/blog/multi-container-pods-and-container-communication-in-kubernetes/Pave ...

  3. java架构之路-(tomcat网络模型)简单聊聊tomcat(二)

    上节课我们说到的Tomcat,并且给予了一般的tomcat配置,和配置的作用,提到了HTTP/1.1 也就是我们的网络通讯模型,那么HTTP/1.1又代表什么呢.我们来简答看一下. tomcat有四种 ...

  4. js 复制 标签中的内容 方法

    <span id='id'>hello world</span><input type='button' onClick='copy("id")' v ...

  5. WPF-带有GridView的ListView样式

    ListView是展示数据的常用控件,这里简单对带有GridView的ListView样式进行设置. <Style TargetType="{x:Type ListViewItem}& ...

  6. ASP.NET Core appsettings.json 文件

    ASP.NET Core appsettings.json 文件 在本节中,我们将讨论 ASP.NET Core 项目中appsettings.json文件的重要性. 在以前的 ASP.NET 版本中 ...

  7. scrapy框架抓取表情包/(python爬虫学习)

    抓取网址:https://www.doutula.com/photo/list/?page=1 1.创建爬虫项目:scrapy startproject biaoqingbaoSpider 2.创建爬 ...

  8. opencv::GMM(高斯混合模型)

    GMM方法概述:基于高斯混合模型期望最大化. 高斯混合模型 (GMM) 高斯分布与概率密度分布 - PDF 初始化 初始化EM模型: Ptr<EM> em_model = EM::crea ...

  9. 1.说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程?

    作者:中华石杉 面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ.ES.Redis.Dubbo,上来先问你一些思考性的问题.原 ...

  10. Jenkins的CI持续集成

    Jenkins的CI持续集成 全局配置 系统管理->全局工具配置,配置Git,JDK和Maven 1)解压maven到当前目录 tar zxf apache-maven-3.5.4-bin.ta ...