AcWing 2069. 网络分析
原题链接
困难
作者:
秦行至
,
2021-04-13 21:55:37
,
所有人可见
,
阅读 243
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 100010
using namespace std;
int n,m;
int p[N],d[N];
int find(int x)
{
/*if(p[x]!=x) p[x]=find(p[x]);
return p[x];*/
if(p[x] == x || p[p[x]] == p[x]) return p[x];
int r = find(p[x]);
d[x] += d[p[x]];//一般都是直接指向祖宗节点,但如果祖宗节点已经改变但是子节点就会多经历一次d[a]-=d[b]
p[x] = r; //所以这里给加回去
return r;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i ++) p[i] = i;
while(m --)
{
int t,a,b;
scanf("%d %d %d",&t,&a,&b);
if(t == 1)
{
a = find(a),b = find(b);
if(a != b)
{
d[a] -= d[b]; //这样才能保证a里面的子树节点值不变
p[a] = b;
}
}
if(t == 2)
{
a = find(a);
d[a] += b;
}
}
for(int i = 1;i <= n;i ++)
if(i == find(i)) printf("%d ",d[i]);
else printf("%d ",d[i] + d[find(i)]);
return 0;
}