网络分析(已解决)
using namespace std;
const int N = 1e4 + 10;
int p[N], s[N];
int find(int x) // 并查集
{
if(p[x]==x||p[p[x]] == p[x])return p[x];//当x的父节点为根节点或者x本身为根节点时,就不需要进行路径压缩,直接返回即可
// 如果以上情况都不满足那么将x直接指向根节点,在指向之前父节点是直接指向根节点的(因为他是递归的),所以要把s[x]加上s[p[x]],这样才是x到根节点的权值
int r = find(p[x]);
s[x] += s[p[x]];
p[x] = r;
return r;
}
int main()
{
int n, m;
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(p[a]), b =find(p[b]);
if(find(a) != find(b)){
s[find(a)] -= s[find(b)];
p[find(a)] = find(b);
}
}
else {
s[find(a)] += b;
}
}
for(int i = 1; i <= n; i ++)
{
if(find(i) == i)cout << s[i]<<" ";
else {
cout << s[i] + s[find(i)] << " ";
}
}
}
未解决 文章被收录于专栏
记录自己还有问题的题目