DB小左 题解分享 · 2025/3/27
网络分析(编程题) - 题解
``` #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