题目

小明正在做一个网络实验。

他设置了 n 台电脑,称为节点,用于收发和存储数据。

初始时,所有节点都是独立的,不存在任何连接。

小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信了。

两个节点如果存在网线连接,称为相邻。

小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送到每个相邻的节点,之后这些节点又会转发到自己相邻的节点,直到所有直接或间接相邻的节点都收到了信息。

所有发送和接收的节点都会将信息存储下来。

一条信息只存储一次。

给出小明连接和测试的过程,请计算出每个节点存储信息的大小。
image
##题解

#include<iostream>
using namespace std;
const int N=10010;
int p[N];
int d[N];
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 p[x];
}

int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)p[i]=i;
    while(m--){
        int c,a,b;
        cin>>c>>a>>b;
        if(c==1){
            a=find(a);
            b=find(b);
            //a指向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)]<<" ";
    }
    
    return 0;
}