记录编号 605702 评测结果 AAAAAAAAAAAAAAAAAAAAA
题目名称 4173.[USACO25 Feb Gold]Bessie s Function 最终得分 100
用户昵称 Gravatar左清源 是否通过 通过
代码语言 C++ 运行时间 2.148 s
提交时间 2025-09-06 16:05:27 内存使用 20.68 MiB
显示代码纯文本
#include <bits/stdc++.h> 
using namespace std;
const int N=2e5+10;
int n,a[N],c[N],mk[N],vis[N],pos;
vector<int>G[N];
long long dp[N][2],res,ans;
void dfs(int x,int fa){
	//cout<<x<<" "<<fa<<endl;
	//system("pause");
	mk[x]=1;
	dp[x][0]=0;
	dp[x][1]=(x==a[x])?0:c[x];
	for(auto y:G[x]){
		//cout<<x<<"->"<<y<<endl;
		if(y==fa||pos==y)continue;
		dfs(y,x);
		dp[x][1]+=min(dp[y][0],dp[y][1]);
		dp[x][0]+=dp[y][1];
	}
	return;
}
int main(){
	freopen("Function.in","r",stdin);
	freopen("Function.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",a+i);
	for(int i=1;i<=n;i++)scanf("%d",c+i);
	for(int i=1;i<=n;i++){
		G[a[i]].push_back(i);
	}
	for(int i=1;i<=n;i++){
		if(!mk[i]){
			int x=i;
			while(!vis[x])vis[x]=1,x=a[x];//cout<<x<<endl;
			pos=x;dfs(x,0);res=dp[x][1];//cout<<dp[x][1]<<endl;
			pos=a[x];dfs(a[x],0),res=min(res,dp[a[x]][1]);//cout<<dp[a[x]][1]<<endl;
			ans+=res;
		}
	}
	printf("%lld\n",ans);
	return 0;
}