大佬就是大佬看了大佬的做法觉得太妙了,原来暴力vector存所有节点就过了7个点,然后其实可以新建节点,把要加的值加到该新节点就行了,最后遍历所有根节点,就是普通的树的dfs,把所有值累加上去。就行了。
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=20010;
const int M=220010;
int h[M],e[M],ne[M],idx;
int p[M+N];
int n,m;
int f[M];
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int find(int x)
{
if(p[x]!=x)
p[x]=find(p[x]);
return p[x];
}
void dfs(int u,int fa)
{
if(fa!=-1)
f[u]+=f[fa];
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
dfs(j,u);
}
}
int main()
{
memset(h,-1,sizeof h);
cin >> n >> m;
int root=n+1;
for(int i=1;i<M;i++)
p[i] = i;
while(m--)
{
int t;
cin>>t;
if(t==1)
{
int a,b;
cin>>a>>b;
a=find(a),b=find(b);
if(a!=b)
{
add(root,a);
add(root,b);
p[a]=root;
p[b]=root;
}
root++;
}
else
{
int a,b;
cin>>a>>b;
a=find(a);
f[a]+=b;
}
}
for(int i=n+1;i<root;i++)
if(p[i]==i)
dfs(i,-1);
for(int i=1;i<=n;i++)
cout<<f[i]<<' ';
cout<<endl;
return 0;
}