首页 > 其他分享 >[题解][2021浙江CCPC] Shortest Path Query

[题解][2021浙江CCPC] Shortest Path Query

时间:2024-04-26 23:44:05浏览次数:28  
标签:count int 题解 ans CCPC 2021 lca dis

题目描述

输入一张无向图,对于无向图的每条边u,v,w,将u和v转换成二进制后,u是v的前缀。
给出q次询问,每次输入s,t,求s到t的最短距离。

题解

从题目数据而言,n为1e5,m为2e5,显然一般的多源最短路算法无法完成。
考虑此题的特殊性质:由于边仅可能从u连向以u为前缀的v,那么若建立一颗以1为根的完全二叉树,u一定是v的祖先。
考虑以二叉树的形式维护答案:设dis[x][p]表示点x向上p层,得到的祖先到x的距离。
也就是说,对于任意的s和t,只需要找到s和t的最近公共祖先,然后从将该祖先根节点1路径上的所有点设为中转点o,计算s到o的距离和o到t的距离即可。

代码

#include<bits/stdc++.h>
#define  int  long long
using namespace std;
const int N=100007,M=200007;
int en=0;
int dis[N][20],vis[N],in[N],d[N],h[N];
struct Edge{
	int v,w,nxt;
}e[M<<1];
void adde(int u,int v,int w){
	e[++en].w=w,e[en].v=v,e[en].nxt=h[u],h[u]=en;
}
int count(int u,int v){
	int res=0;
	while(u<v){
		res++;
		v>>=1;
	}
	return res;
}
int LCA(int u,int v){
	while(u!=v){
		if(u>v)u>>=1;
		else v>>=1;
	}
	return u;
}
void dijkstra(int s){
	priority_queue< pair<int,int> >q;
	q.push(make_pair(0,s));
	d[s]=0,in[s]=s;
	while(!q.empty()){
		int x=q.top().second;
		q.pop();
		if(vis[x]==s)continue;
		vis[x]=s;
		dis[x][count(s,x)]=d[x];
		for(int i=h[x];i;i=e[i].nxt){
			int y=e[i].v,w=e[i].w;
			if(y<s)continue;
			if(in[y]!=s){
				in[y]=s;
				d[y]=1e16;
			}
			if(d[y]>d[x]+w){
				d[y]=d[x]+w;
				q.push(make_pair(-d[y],y));
			}
		}
	}
}
void ask(int s,int t){
	int ans=1e16;
	int lca=LCA(s,t);
	int ss=count(lca,s),tt=count(lca,t);
	for(;lca;lca>>=1)ans=min(ans,dis[s][ss++]+dis[t][tt++]);
	if(ans!=1e16)cout<<ans<<endl;
	else cout<<-1<<endl;
}
signed main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		adde(u,v,w),adde(v,u,w);
	}
	memset(dis,0x3f3f3f3f,sizeof dis);
	for(int i=1;i<=n;i++)dis[i][0]=0;
	for(int i=1;i<=n;i++)dijkstra(i);
	int q;
	cin>>q;
	while(q--){
		int s,t;
		cin>>s>>t;
		ask(s,t);
	}
}

标签:count,int,题解,ans,CCPC,2021,lca,dis
From: https://www.cnblogs.com/zwzww/p/18161099

相关文章

  • P4707 重返现世 题解
    Description为了打开返回现世的大门,Yopilla需要制作开启大门的钥匙。Yopilla所在的迷失大陆有\(n\)种原料,只需要集齐任意\(k\)种,就可以开始制作。Yopilla来到了迷失大陆的核心地域。每个单位时间,这片地域就会随机生成一种原料。每种原料被生成的概率是不同的,第\(i\)种......
  • [题解] [NOIP 2010] 饮水入城
    [题解][NOIP2010]饮水入城题目描述有一个\(n\timesm\)的矩阵,每一点的高度是\(h_{i,j}\)。矩阵的最下面一行是\(m\)个城市,现在要在第一行建水站为这些城市供水,水站建好后水可以从水站往别的点引水,只能从高处引向相邻的低处,如果一个城市存在可以给他引水的水站,则这个城......
  • [题解] [洛谷P4158] 粉刷匠
    [题解][洛谷P4158]粉刷匠题目描述有\(n\)个木板,每个木板有\(m\)个格子,所有格子最开始视为没有颜色。有\(0/1\)两种颜色,每次可以粉刷其中一块木板上一段连续的格子,总共可以粉刷\(t\)次。给出一组目标颜色,问最多可以将多少个格子粉刷成目标颜色。输入格式第一行包含......
  • 列表删除按钮,分页错位问题解决思路 table delete page loadTable
    列表删除按钮,分页错位问题解决思路this.$api('/xxx/xxx/deletexxx',{ids:id}).then(res=>{if(res.status!==20)returnthis.$Message.destroy()this.$Message.success('删除成功')if(this.tableData.leng......
  • node: /lib64/libm.so.6: version `GLIBC_2.27‘ not found问题解决方案
    问题centos7服务器使用nvm或n安装的16以后的高版本node,均会出现以下问题解决1.升级gcc与make#升级GCC(默认为4升级为8)yuminstall-ycentos-release-sclyuminstall-ydevtoolset-8-gcc*ln-s/opt/rh/devtoolset-8/root/bin/gcc/usr/bin/gccln-s/opt/rh/devtool......
  • P10371 「LAOI-4」石头 题解
    原题链接:P10371。首先我们设\(l_{i,0/1}\)表示\(i\)左边的第一,二个比\(a_i\)大的数的位置。\(r_{i,0/1}\)同理。考虑一个区间\([L,R]\)在什么时候满足条件,设\(p,q\)分别为区间中最大/次大值的位置,我们分三种情况讨论。情况一:\(L<p<R\)。考虑从\(L,R\)开......
  • 洛谷题解-官方题单-递归与递推
    P1255数楼梯原题链接题目描述楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。编一个程序,计算共有多少种不同的走法。对于60%的数据,N≤50;对于100%的数据,1≤N≤5000。思路:每次有2种方法上楼梯,要么上一阶,要么上二阶。第一种:得50分的做法是可以用递归来解:点击查看代码......
  • [题解][2021浙江CCPC] Fair Distribution
    题目描述给定两个数n,m,每次操作可以让n-1或者m+1,求使m%n==0的最少操作数量。题解设进行n-t次操作,使n变成t。若m%t不为0,此时的操作数量为:n-t+t-m%t。若m%t==0,操作数量为n-t。那么只需要枚举t就可以解决此题。但会发现t的范围从1-n过大,考虑将t的范围限制在1-sqrt(m),且每次分别......
  • 20211317 李卓桐 Exp5 信息搜集与漏洞扫描 实验报告
    Exp5信息搜集与漏洞扫描实验报告1、实践目标掌握信息搜集的最基础技能与常用工具的使用方法。2、实践内容(1)各种搜索技巧的应用(2)DNSIP注册信息的查询(3)基本的扫描技术:主机发现、端口扫描、OS及服务版本探测、具体服务的查点(以自己主机为目标)(4)漏洞扫描:会扫,会看报告,会查漏......
  • [题解]P5656 【模板】二元一次不定方程 (exgcd)
    P5656【模板】二元一次不定方程(exgcd)若存在\(ax+by=c\),则可以根据特解\(x,y\)求出任意通解\(x',y'\):\(\begin{cases}x'=x+k*\frac{b}{\gcd(a,b)}\\y'=y-k*\frac{a}{\gcd(a,b)}\end{cases}(k\in\mathbb{Z})\)求特解的方法是「扩展欧几里得(exgcd)」,如果没接触过可以先阅读......