AcWing2069.网格分析

本文介绍了如何使用并查集数据结构解决网络分析问题,通过C++代码展示了如何在AcWing题库中合并连通块并计算路径上的总距离。
摘要由CSDN通过智能技术生成

【题目链接】2069. 网络分析 - AcWing题库

输入样例1:
4 8
1 1 2
2 1 10
2 3 5
1 4 1
2 2 2
1 1 2
1 2 4
2 2 1
输出样例1:
13 13 5 3

【代码及详细注释】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,p[N],d[N];
//p数组用于维护并查集,d数组用于维护大小 
int find(int x)
{
	if(p[x]==x||p[p[x]]==p[x]) return p[x];
	int r=find(p[x]);
	d[x]+=d[p[x]];//当前点的距离需要加上父节点的距离 
	p[x]=r;
	return r;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) p[i]=i;//初始化并查集
	while(m--)
	{
		int t,a,b;
		cin>>t>>a>>b;
		if(t==1)//执行合并操作
		{
			a=find(a),b=find(b);//找到两个点的父节点
			if(a!=b)//如果不在同一连通块中就进行合并
			{
				d[a]-=d[b];
				p[a]=b;	
			}	
		} 
		else{
			a=find(a);
			d[a]+=b;
		}
	 } 
	for(int i=1;i<=n;i++)
	{
		if(i==find(i)) cout<<d[i];
		else cout<<d[i]+d[find(i)];//如果不是根节点需要输出这条路径上所有的距离和 
		cout<<" ";
	}
	return 0;
}

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值