CF1051F The Shortest Statement

Mac新手必看:nvm安装全攻略(含常见错误解决方案) 本文为Mac开发者提供nvm安装与使用全攻略,涵盖环境准备、安装步骤、Shell配置优化及常见错误解决方案。详细讲解如何利用nvm管理多Node版本,提升开发效率,特别针对国内用户提供网络问题解决技巧,是Mac新手必备的Node版本管理指南。 阅读详情

题意
给你一个有 nnn 个点,mmm 条边的无向连通图。有 qqq 次询问,第 iii 次询问回答从 uiu_iui​​ 到 viv_ivi​​ 的最短路的长度。
数据范围:1≤n≤105  n−1≤m≤n+201 \le n \le 10^5 \ \ n-1\le m\le n+201≤n≤105  n−1≤m≤n+20

思路
看到多源最短路,首先想到 "Johnson 全源最短路径“ 但时间复杂度是O(n2)O(n^2)O(n2) 不能接受。
观察数据范围。n−1≤m≤n+20n-1\le m\le n+20n−1≤m≤n+20 这个条件给的很特殊考虑从这入手。
考虑松弛操作
dx,z=min(dx,z,dx,y+dy,z)d_{x,z}=min(d_{x,z},d_{x,y}+d_{y,z})dx,z​=min(dx,z​,dx,y​+dy,z​)
可以随便建一棵生成树,把路径分成只经过树边和经过其他边两种形式。对于第一种直接倍增求lca再算距离即可。对于第二种,发现如果要经过其他边,则一定会经过这条其他边的端点(好像是句废话 )。而这种其他边最多只有21条,端点最多只有42个直接对于所有端点跑单元最短路预处理。处理答案时再算就行。具体可以看代码。

code

#include<bits/stdc++.h>
using namespace std;
#define int long long
void read(int &n){
	n=0;short f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while('0'<=ch&&ch<='9'){n=(n<<1)+(n<<3)+(ch^48);ch=getchar();}
	n=n*f;
}
void write(int n){
	if(n<0){printf("-");write(-n);return;}
	if(n<10){putchar(char(n+'0'));return;}
	write(n/10);
	putchar(char(n%10+'0'));
}
int Q,n,m,tag[100005],cnt[50][100005],mp1[100005],mp2[100005],k;
int fa[100005],xxxxx[100005],f[100005][30],deg[100005],ans,dep[100005];
vector<pair<int,int> > q[100005],e[100005];
int find(int id){
	if(fa[id]!=id) fa[id]=find(fa[id]);
	return fa[id];
}
struct node{
	int num,id;
};
struct cmp{
	bool operator ()(node x,node y){
		return x.num>y.num;
	}
};
priority_queue<node,vector<node>,cmp> p;
void dij(int ii,int s){//dij模板
	while(!p.empty()) p.pop();
	for(int i=1;i<=n;i++){
		cnt[ii][i]=1e18;
		xxxxx[i]=0;
	}
	cnt[ii][s]=0;
	p.push(node{0,s});
	while(!p.empty()){
		node u=p.top();
		p.pop();
		if(xxxxx[u.id]) continue;
		xxxxx[u.id]=1;
		for(int i=0;i<(int)q[u.id].size();i++){
			int v=q[u.id][i].first,w=q[u.id][i].second;
			if(cnt[ii][u.id]+w<cnt[ii][v]){
				cnt[ii][v]=cnt[ii][u.id]+w;
				p.push(node{cnt[ii][v],v});
			}
		}
	}
}
void dfs(int id,int fa){
	f[id][0]=fa;
	dep[id]=dep[fa]+1;
	for(int i=1;i<=20;i++) f[id][i]=f[f[id][i-1]][i-1];
	for(int i=0;i<(int)e[id].size();i++){
		if(e[id][i].first==fa) continue;
		deg[e[id][i].first]=deg[id]+e[id][i].second;
		dfs(e[id][i].first,id);
	}
}
int lca(int u,int v){//倍增求Lca模板
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=20;i>=0;i--)
		if(dep[f[u][i]]>=dep[v]) u=f[u][i];
	if(u==v) return v;
	for(int i=20;i>=0;i--)
		if(f[u][i]!=f[v][i]){
			u=f[u][i];
			v=f[v][i];
		}
	u=f[u][0];
	v=f[v][0];
	return u;
}
int Len(int u,int v){
	int ff=lca(u,v);
	return deg[u]+deg[v]-deg[ff]-deg[ff];
}
signed main(){
	read(n);read(m);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1,u,v,w;i<=m;i++){
		read(u);read(v);read(w);
		q[u].push_back(make_pair(v,w));
		q[v].push_back(make_pair(u,w));
		int nx=find(u),ny=find(v);//并查集,判断是否已经联通。
		if(nx!=ny){
			e[u].push_back(make_pair(v,w));
			e[v].push_back(make_pair(u,w));
			fa[nx]=ny;
		}
		else{
			tag[u]=1;
			tag[v]=1;
		}
	}
	for(int i=1;i<=n;i++){
		if(tag[i]){
			k++;
			mp1[i]=k;
			mp2[k]=i;
			dij(k,i);
		}
	}
	dfs(1,0);
	read(Q);
	for(int i=1,u,v;i<=Q;i++){
		read(u);read(v);
		ans=Len(u,v);//只走树边
		for(int j=1;j<=k;j++) ans=min(ans,cnt[j][u]+cnt[j][v]);//走其他边
		write(ans);puts("");
	}
    return 0;
}
《点云进阶》专栏文章目录 点云进阶》专栏文章目录 阅读详情

相关推荐

应急响应-勒索病毒典型处置案例

服务器感染Globelmposter勒索病毒 事件背景 2020年5月,某公司内外服务器遭遇勒索病毒攻击,应急响应工程师在抵达现场后,对包含服务器在内的13太机器进行系统排查和日志分析。 事件处置 勒索病毒初步判定 首先,对其中一台感染勒索病毒的主机A(源地址为192.168.111.129)进行排查,通过勒索信确认为GlobeImposter勒索病毒,如图所示。 在本地桌面及磁盘发现加密文件后缀为.RESERVE,如图所示。 系统排查 主机账号 通过

qq_50765147的博客 2458

CF1051F The Shortest Statement Dijkstra+生成树

题意: 给定一张nnn个点mmm条边的图,qqq次询问两点之间的最短路 范围&性质:1≤n,m,q≤105,1≤m−n≤201\le n,m,q\le 10^5,1\le m-n\le 201≤n,m,q≤105,1≤m−n≤20 分析: 题面及其简洁,所以我们发现唯一显得很特别的一个条件就是1≤m−n≤201\le m-n\le 201≤m−n≤20 ,这个条件说明了什么,说明了整张图可以看做一棵树上多挂了几条边,所以我们只要对于特殊边所在的点跑一遍最短路,因为任意点对要么从树上走,要么必定经过这

youth518的博客 153

使用SSE流式输出(Javaweb前后端实战)

SSE(Server-Sent Events)是一种在Web应用中实现单向实时通信的技术。通过SSE,服务器可以主动向客户端发送更新,而无需客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端,长连接)

记得开心一点嘛的博客 1万+

[CF1051F]The Shortest Statement

The Shortest Statement 题解 看到此题应该很容易想到最短路,但是由于,肯定不能直接跑最短路。 但是我们很快就发现了一个奇怪的数据范围,。 这说明,在构成一棵生成树后,剩下来的边不会超过21条。而我们将一条边插入在树上后会构成一棵基环树,而将其环上的一条边去掉便会形成一棵新树。 我们发现,将一个点到其它点的最短路径标出来后一定会形成一棵新的生成树,而路径肯定是其树上的一条路径。 当然不可能把全部树建出来跑,不说时间,空间都会炸。 但我们发现,我们其实还是可以先建一棵树出来,

StaroForgin的博客 199

保姆级教程:用Jetson Orin Nano和ROS2 Humble搞定PIXhawk 4飞控通信(含配置文件详解)

本文提供了一份详细的Jetson Orin Nano与PIXhawk 4飞控通信配置指南,涵盖硬件连接、ROS2 Humble环境搭建、MAVROS2配置及通信调试全流程。通过实战案例和配置文件详解,帮助开发者快速实现无人机上位机与飞控的稳定通信,适用于无人机开发与自动化控制场景。

weixin_33670786的博客 475

Excel也能玩转K-means聚类?手把手教你用表格搞定用户分群(附完整公式)

本文详细介绍了如何在Excel中实现K-means聚类算法,无需编程即可完成用户分群。通过SUMIF、SQRT等基础函数,从数据预处理到最终分群全流程手把手教学,特别强调数据标准化和迭代优化的关键步骤,帮助运营团队低成本高效分析用户行为数据。

weixin_30555125的博客 181

CF 1051 F. The Shortest Statement

F. The Shortest Statement http://codeforces.com/contest/1051/problem/F 题意:   n个点,m条边的无向图,每次询问两点之间的最短路。(m-n<=20) 分析:   dijkstra。   如果是一棵树,那么可以直接通过,dis[u]+dis[v]-dis[lca]*2来求。现在如果建出一棵树,那么非树边...

weixin_30498921的博客 158

Python 爬虫实战:亚马逊商品评论 + 评分抓取(情感分析数据预处理)

在电子商务领域,用户评论是了解产品口碑和市场反馈的重要渠道。亚马逊作为全球领先的电商平台,拥有海量的商品评论数据。本文将详细介绍如何使用 Python 编写爬虫程序,从亚马逊网站抓取商品评论和评分数据,并进行情感分析的数据预处理。

yansideyucsdn的博客 769

cf 1051F The Shortest Statement

一 原题 F. The Shortest Statement time limit per test: 4 seconds memory limit per test: 256 megabytes input: standard input output: standard output You are given a weighed undirected connected grap...

max_kibble的博客 490

YOLOv13添加DRB模块map暴涨12.33!准确率提升8.56!召回率提升15.66

本文介绍了在YOLOv13模型中添加DRB模块的改进方法。实验结果显示,添加DRB模块后模型性能显著提升,mAP暴涨12.33%,准确率提升8.56%。文章详细说明了移植过程,包括创建yolov13-DRB.yaml配置文件、修改tasks.py和__init__.py文件,以及引入UniRepLKNet模块的具体实现。其中重点描述了GRNwithNHWC、NCHWtoNHWC等核心组件的实现细节,并提供了完整的模型结构配置代码。这些改进使得YOLOv13模型在保持原有架构优势的同时,获得了更强大的特征提取

FJN110的博客 2819

本文将详细介绍如何在 Qt (C++) 应用程序中集成 osgEarth,加载三维数字地球,并在指定经纬度添加三维模型(如飞机、建筑等)。

OSG 与 Qt 的交互通常需要处理 OpenGL 上下文。osgEarth 3.x 提供了对 Qt 的较好支持,或者可以使用。在普通 OSG 程序中,你需要手动处理坐标系转换将经纬度转为笛卡尔坐标 (XYZ)。这是实现的关键,将 OSG 的渲染循环集成到 Qt 的事件循环中。第三方库,但在本教程中,我们将展示一种通过继承。,将 Qt 的输入事件转换为 OSG 理解的。事件,这是实现交互(旋转地球、缩放)的基础。来嵌入 OSG 视图的标准方法。在这里我们初始化地球并添加模型。节点简化了这一过程。

qq_45859163的博客 1044

[CF 1051F] The Shortest Statement

也许是最后的几篇题解了

ICEEBBING的博客 361

Claude Code 100个真实案例 - 用AI绘制CAD机械图纸(工程师看了直呼内行)

本案例展示如何使用 Claude Code 配合 Python 的 `ezdxf` 库,从零开始生成专业级 CAD 机械图纸。我们将绘制一个完整的法兰盘零件图,包含主视图、俯视图、标注尺寸、粗糙度标记和标题栏,最终生成标准 DXF 文件,可直接在 AutoCAD 或 FreeCAD 中打开编辑。

yueyeguzhuo的专栏 894

CF1051F The Shortest Statement [最短路]

传送门 注意到 m - n <= 20, 这意味着我们可以先dfs出一棵树,然后对于这m-n+1条边特殊考虑 我们发现,m-n+1条边最多40个点,那么我们对于这40个点暴力跑以它们为原点的最短路 查询时两个点的最短路要么在树上,要么经过这些特殊点,我们枚举这些特殊点就可以了 #include<bits/stdc++.h> #define N 200050 using ...

FSYo 的博客 243

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【题解】Luogu CF1051F The Shortest Statement

原题传送门:CF1051F The Shortest Statement 题目大意,给你一个稀疏图,q次查询,查询两点之间距离 边数减点小于等于20 这不是弱智题吗,23forever dalao又开始虐题 作为蒟蒻的我只能在一旁出售烤绿鸟和main包,和大家一起吃西瓜 仔细想想,这题的确是很弱智 先随便找一个生成树,这样就能跑lca了 剩下的几条边的端点跑一下SPFA堆优化dij,用于...

weixin_30613433的博客 145

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

题解 CF1051F 【The Shortest Statement】

这道题思路比较有意思,第一次做完全没想到点子上。。。 看到题目第一反应是一道最短路裸题,但是数据范围1e5说明完全不可能。 这个时候可以观察到题目给出了一个很有意思的条件,就是说边最多比点多20。 这有什么用呢? 那么我们大胆猜想,可否将整个图划分为21条边(连接最多42个点)和一颗树?(极限情况) 如果这样的话,对于任意的两个节点uv,它们之间的最短路只有两种情况: 这两个点都在树上。所以说...

weixin_34119545的博客 180

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

CF1051F The Shortest Statement Dijkstra + 性质分析

Code: #include<bits/stdc++.h> using namespace std; void setIO(string s) { string in=s+".in"; freopen(in.c_str(),"r",stdin); } typedef long long ll; const int max...

weixin_30799995的博客 112

[CF1051F] The Shortest Statement

CF 题目传送门 洛谷 题目传送门 一道最短路的题。 首先题目条件给出m-n<=20,可以看出这个图近乎一棵树。 首先跑出图的dfs树,预处理出树上距离等信息。 再枚举非树边,对每一个非树边的端点跑一边dijkstra。 可以看出最多有42个这样的点。 回答询问的时候,用树上距离作为答案,再用每一个非树边的端点更新答案即可。 1 #include<cstdio&...

weixin_30278237的博客 86

CF 1051F The Shortest Statement

要求每两个点间的最短路,乍一看卧槽这怎么搞! 乱搞。 注意到m<=n+20,很显然要扯到生成树上。 造一棵树,再将非树边加进来(这咋加啊) 以每条非树边的端点为起点跑最短路,统计答案时取树上和非树上的最短距离就好 1 #include<queue> 2 #include<cstdio> 3 #include<cstring...

weixin_30709635的博客 111
上一篇: P5670 秘籍-反复异或
下一篇: CF1767E
Water_Problem
博客等级 码龄2年 71粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值