返回题解分享
讨论 / 题解分享/ 帖子详情

网络分析(编程题) - 题解

#include<bits/stdc++.h>
using namespace std;

int fa[100010];
int la[100010];
//按秩合并保证树结构,跟这道题没啥关系
int rnk[100010] = {0};
//设计了一个根节点映射数组,每一次有节点发送信息就找到根节点遍历数组
unordered_map<int, vector<int>> sets;
int m,n;

int root(int x){
    return fa[x] == x ? x : root(fa[x]);
}

void merge(int a, int b){
    a = root(a);
    b = root(b);
    if(a == b) return;
    if(rnk[a] > rnk[b]) swap(a, b);
    fa[a] = b;
    //将子节点数组的元素加入父节点
    sets[b].insert(sets[b].end(), sets[a].begin(), sets[a].end());
    if(rnk[a] == rnk[b]) rnk[b]++;
}

void sendm(int p, int t){
    p = root(p);
    for(auto i : sets[p]){
        la[i] += t;
    }
}

int main(){
    cin>>n>>m;
    for(int i = 1; i <= n; i++){
        fa[i] = i;
        la[i] = 0;
        sets[i] = {i};
    }
    int index,a,b;
    while(m--){
        cin>>index>>a>>b;
        if(index == 1){
            merge(a, b);
        }
        else if(index == 2){
            sendm(a, b);
        }
    }
    for(int i = 1; i <= n; i++){
        cout<<la[i]<<" ";
    }
}
0 回复 0 转发 0 喜欢 7 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!