解题思路:改写并查集的合并函数和查找函数进行写题
#include<bits/stdc++.h>
using namespace std;
typedef struct Person{
int parent;
bool flag=false;//判断是否得道
int beishu;//得到后的功力增加的倍数
}Person;
Person p[100001];
int finds(int a){//判断是多少代
int j=0;
while(a!=p[a].parent){
a=p[a].parent;
j++;
}
return j;
}
void uniont(int a, int b){//让每一代徒弟都紧接着师傅
p[b].parent=a;
}
int main(){
int n;
double power,r;
cin>>n>>power>>r;
for(int i=0;i<n;i++)
p[i].parent=i;
int k,kid,beishu;
for(int i=0;i<n;i++){
cin>>k;
if(k==0){
cin>>beishu;
p[i].flag=true;
p[i].beishu=beishu;
continue;
}
for(int j=1;j<=k;j++){
cin>>kid;
uniont(i,kid);
}
}
double sum=0,count;
for(int i=0;i<n;i++){
if(p[i].flag==true){
count=finds(i);
double sum1=power;
for(int j=1;j<=count;j++)
sum1*=(1-r/100);
sum+=sum1*p[i].beishu;
}
}
cout<<int(sum);
}
运行结果: