1202: 侦探PIPI
注意1: 1-2-3-4-5-2 这样的特殊的成环方式要思考一下怎么在5的时候结束
注意2:递归函数如果我在函数里对vis清空,会死循环。
注意3:m很大的话,叶子节点的a【i】会重复计入,所以应该要及时对叶子节点的a【i】清零
注意4:结果可能会是longlong
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
long long a[N];
int v[N];
int vis[10];
int find(int i){ //i地点一路找到自己的最最父节点
vis[i]=1;
if (i == v[i])
return i;
else if(vis[v[i]]==1){ //说明成环了
v[i]=i;
return i;
}
v[i] = find(v[i]);
return v[i];
}
bool cmp(long long a,long long b){
return a>b;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&v[i]);
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
find(i);
}
for(int i=1;i<=n;i++){
if(v[i]!=i)
{
a[v[i]]+=a[i];
a[i]=0;
}
}
sort(a+1,a+n+1,cmp);
long long sum=0;
for(int i=1;i<=m;i++){
sum+=a[i];
}
printf("%lld",sum);
}

浙公网安备 33010602011771号