首页 > 其他分享 >P2901题解

P2901题解

时间:2024-08-09 16:30:03浏览次数:11  
标签:node cnt pq int 题解 短路 Astar P2901

题目大意

输出一张有向带权图前k短路的长度

思路分析

这是道k短路板子题
我们可以用Astar算法来实现它
OIwiki相关算法的网页
简单来讲,Astar定义了一个估值函数f(x)=g(x)+h(x) g(x)表示由起点到达x点的路程(不一定是最短路),而h(x)则是终点到x点的最短路程
这个估值函数可以预估从该点到终点的最短路径。
在搜索中,Astar可以帮助剪枝
而在求k短路中,Astar则可以保证访问终点路径的次序与路径长度从小到大的次序相同
每次取最优f[x]进行拓展,必然可以保证较短的路径先被拓展
因此可以用Astar算法算k短路
终点被第几次访问的代价就是第几短路
代码实现方面,先从终点跑一遍单源最短路,然后从起点开始搜索,用cnt记录访问终点的次数,如果次数为k,结束搜索;如果搜索完后发现cnt不足k,再补-1输出

AC代码

#include<bits/stdc++.h>
#define N 10010
using namespace std;
struct node{int v,w;};
struct cmp{
	bool operator()(node a,node b){return a.w>b.w;}
};
vector<node>g[N],rg[N];
int n,m,k,H[N];
void dijkstra(){
	memset(H,0x3f,sizeof(H));
	queue<int>q;
	q.push(1);
	H[1]=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(node t:rg[u]){
			if(H[t.v]>H[u]+t.w){
				H[t.v]=H[u]+t.w;
				q.push(t.v);
			}
		} 
	} 
}
void Astar(){
	priority_queue<node,vector<node>,cmp>pq;//实际上,优先队列不必要重载运算符号
	pq.push({n,H[n]});
	int cnt=0;
	while(!pq.empty()){
		node tep=pq.top();
		pq.pop();
		int u=tep.v,w=tep.w;
		if(u==1){
			cnt++;
			printf("%d\n",w);
			if(cnt==k)return; 
		}
		for(auto t:g[u])pq.push({t.v,w+t.w-H[u]+H[t.v]});
	}
	for(;cnt<k;cnt++)printf("-1\n"); 
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1,u,v,d;i<=m;i++){
		scanf("%d%d%d",&u,&v,&d);
		g[u].push_back({v,d});
		rg[v].push_back({u,d});//反向建边求以n点出发的单源最短路 
	}
	dijkstra();
	Astar();
}

标签:node,cnt,pq,int,题解,短路,Astar,P2901
From: https://www.cnblogs.com/wanxue/p/18350957

相关文章

  • Codeforces 165E Compatible Numbers 题解
    思路高维前缀和高维前缀和把数的二进制看成一个集合,二进制的每一位为\(1\)为全集\(V\)。根据题目描述,若两数\(a,b\)相容,则\(a\operatorname{and}b=0\),容易发现,\(b\in\complement_{V}a\),所以我们只需要用高维前缀和处理出\(\complement_{V}a\)的一个元素即可。......
  • ABC349D题解
    [ABC349D]DivideInterval题解传送门:luogu|atcoder题目简述给定非负整数\(l\)和\(r\)(\(l<r\)),令\(S(l,r)\)表示序列\((l,l+1,\ldots,r-2,r-1)\),其中包含从\(l\)到\(r-1\)的所有整数。此外,一个序列被称为“好序列”,当且仅当它可以表示为\(S(2^ij,2^{i}(j+1))\),......
  • AT_past202010_m 筆塗り 题解
    题目传送门前置知识线段树|树链剖分解法观察到要维护树上信息,且更改的呈链状,考虑进行树链剖分。将边权转化成点权,钦定边权给了深度更深的那个点,注意更新时不能更新\(\operatorname{LCA}\)。区间赋值和单点查询用线段树维护即可。代码#include<bits/stdc++.h>usingnam......
  • 如何避免自己问题解决缓慢导致项目周期延长
    在公司实习期间,我发现自己对业务的熟悉程度不足,导致在预期时间和实际完成时间上存在差异。虽然这种情况在后期有所改善,但前期的压力相对较大。为此,我总结了以下几点经验和改进措施:1.问题描述与现有分析我们今天的工作进展如何?当前诊断的调查进展如何?如果进展缓慢,是什么原因?需......
  • ABC349D题解
    [ABC349D]DivideInterval题解传送门:luogu|atcoder题目简述给定非负整数$l$和$r$($l<r$),令$S(l,r)$表示序列$(l,l+1,\ldots,r-2,r-1)$,其中包含从$l$到$r-1$的所有整数。此外,一个序列被称为“好序列”,当且仅当它可以表示为$S(2^ij,2^{i}(j+1))$,其中$i$和$j$......
  • # Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决
    Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决已经很晚了,刚刚解决这个问题,还是想记录一下,因为刚刚接触cocos没多久,这个问题困扰了我很久。背景接手了一个答题小游戏,由于涉及敏感信息就不在这里截图了,交接到我手里的是用cocos开发的,之前从来没有接触......
  • P8819题解
    题目大意现在有个有向图图,共有n个点,m条边总共有四种操作:操作1:将一条边打上标记操作2:将一个点出发的所有边打上标记操作3:将一条边移除标记操作4:将一个点出发的所有边移除标记打上标记的边视为被移除每次操作进行一次询问,如果每个点出度都是1,整张图是个强连通图,那么输出"YES......
  • 题解 洛谷P1478 陶陶摘苹果(升级版)
    题目传送门https://www.luogu.com.cn/problem/P1478截图来自洛谷:这道题就是这道题的升级版而已,我们可以定义一个结构体分别存抓当前苹果的力气与高度。之后进行从第1个苹果到第n个苹果的循环,判断当前苹果高度是否够,力气是否够。最重要的是要排序,因为要摘得苹果最多,所以要先......
  • Redis连接问题解决汇总
    Redis连接失败常见解决方案1.检查Redis命令行是否可以正常连接使用命令行客户端,输入:redis-cli-h虚拟机ip地址-p6379-aredis访问密码如若连接成功,输入ping,看控制台是否返回PONG此步骤若正常,则代表虚拟机可正常连接2.Redis命令行无法正常连接1)未打开Redis6379端口......
  • 牛客多校 A 题题解
    牛客多校8-AHaitangandGameGivenaset\(\textstyleS\),dXqwqandHaitangtaketurnsperformingthefollowingoperations,withdXqwqgoingfirst:Findapair\(\textstyle(x,y)\)suchthat\(\textstylex,y\inS\)and\(\textstyle\gcd(x,y......