题解分享
题解分享简介
网络分析(编程题) - 题解
```
#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
8



