AcWing1171. 距离(lca&&tarjan)

输入样例1:

2 2 
1 2 100 
1 2 
2 1

输出样例1:

100
100

输入样例2:

3 2
1 2 10
3 1 15
1 2
3 2

输出样例2:

10
25
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,m,x,y,k,res[N];
int vis[N];
int dis[N];
int p[N];
vector<pair<int,int>>query[N],e[N];

void dfs(int u,int fa){
	for(auto it:e[u]){
		int to=it.first;
		if(to==fa) continue;
		dis[to]=dis[u]+it.second;
		dfs(to,u);
	}
}
int find(int x){
	if(p[x]!=x) p[x]=find(p[x]);
	return p[x];
}
void tarjan(int u){
	vis[u]=1;
	for(auto it:e[u]){
		int to=it.first;
		if(!vis[to]){
			tarjan(to);
			p[to]=u;
		}
	}
	for(auto it:query[u]){
		int y=it.first;
		int id=it.second;
		if(vis[y]==2){
			int anc=find(y);
			res[id]=dis[u]+dis[y]-dis[anc]*2;
		}
	}
	vis[u]=2;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<n-1;i++){
		scanf("%d%d%d",&x,&y,&k);
		e[x].push_back({y,k});
		e[y].push_back({x,k});
	}
	for(int i=0;i<m;i++){
		scanf("%d%d",&x,&y);
		if(x!=y){
			query[x].push_back({y,i});
			query[y].push_back({x,i});
		}
	}
	for(int i=1;i<=n;i++) p[i]=i;
	dfs(1,-1);
	tarjan(1);
	for(int i=0;i<m;i++) printf("%d\n",res[i]);
	return 0;
}
相关推荐
SoraLuna26 分钟前
「Mac玩转仓颉内测版26」基础篇6 - 字符类型详解
开发语言·算法·macos·cangjie
雨中rain1 小时前
贪心算法(2)
算法·贪心算法
sjsjs113 小时前
【数据结构-表达式解析】【hard】力扣224. 基本计算器
数据结构·算法·leetcode
C++忠实粉丝3 小时前
计算机网络socket编程(6)_TCP实网络编程现 Command_server
网络·c++·网络协议·tcp/ip·计算机网络·算法
坊钰3 小时前
【Java 数据结构】时间和空间复杂度
java·开发语言·数据结构·学习·算法
武昌库里写JAVA3 小时前
一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍
c语言·开发语言·数据结构·算法·二维数组
禊月初三3 小时前
LeetCode 4.寻找两个中序数组的中位数
c++·算法·leetcode
学习使我飞升3 小时前
spf算法、三类LSA、区间防环路机制/规则、虚连接
服务器·网络·算法·智能路由器
庞传奇4 小时前
【LC】560. 和为 K 的子数组
java·算法·leetcode
SoraLuna4 小时前
「Mac玩转仓颉内测版32」基础篇12 - Cangjie中的变量操作与类型管理
开发语言·算法·macos·cangjie