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);
}
posted @ 2026-03-10 20:53  peter_shen  阅读(5)  评论(0)    收藏  举报