喵喵喵幼儿园里有 n 只喵喵,分别编号 1∼n。每只喵喵有一个可爱值 c[i],但每只喵喵有且仅有一只讨厌的喵喵。由于每只喵喵都很自恋,所以每只喵喵讨厌的喵喵不会是它自己。
这天园长 Rin 想找出一些喵喵来组成喵喵队列,她想要喵喵队列的可爱值最大,但一只喵喵不可以和它讨厌的喵喵一同在队伍里。
喵喵队列的可爱值定义为这个队列里所有喵喵的可爱值之和。
#include<bits/stdc++.h>
using namespace std;
const int M=1e6+10;
long long ans[M],sum;
struct ttt{
int x,y;
int val;
}t[M];
int fa[M],n,b[M],mmm[M];
bool cmp(ttt a,ttt b){
return a.val>b.val;
}
inline get(int x){
if(fa[x]==x) return x;
else return fa[x]=get(fa[x]);
}
inline merge(int x,int y){
if(rand()%2)
fa[get(x)]=get(y);
else fa[get(y)]=get(x);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
fa[i]=i;
b[i]=0;
}
for(int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&mmm[i],&t[i].y);
t[i].x=i;
t[i].val=mmm[i];
}
sort(t+1,t+1+n,cmp);
for(int i=1;i<=n;i++){
int f1=get(t[i].x);
int f2=get(t[i].y);
if(f1==f2){
continue;
}
if(b[t[i].x]==0) b[t[i].x]=t[i].y;
else{
merge(b[t[i].x],t[i].y);
}
if(b[t[i].y]==0) b[t[i].y]=t[i].x;
else{
merge(b[t[i].y],t[i].x);
}
}
for(int i=1;i<=n;i++){
int f=get(i);
ans[f]+=mmm[i];
}
for(int i=1;i<=n;i++) sum=max(sum,ans[i]);
printf("%lld",sum);
}
正解给的是基环树上DP,那我用并查集(跟关押罪犯似的)写,哪里会出锅啊QwQ