AcWing2069.网格分析

【题目链接】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、付费专栏及课程。

余额充值