版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37360631/article/details/81838028
WA。。后面补
#include<iostream>
#include<cstdio>
using namespace std;
const int max_n=200005;
const int inf=0x3f3f3f3f;
int n;
int c[max_n];
int a[max_n];
int in[max_n];
bool visit[max_n];
int ans=0;
int res;
void dfs(int u)
{
visit[u]=1;
--in[a[u]];
if(!in[a[u]])dfs(a[u]);
}
void dfs2(int u)
{
if(visit[u])
{
ans+=res;
return;
}
visit[u]=true;
res=min(res,c[u]);
dfs2(a[u]);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",c+i);
for(int i=1;i<=n;i++)scanf("%d",a+i),in[a[i]]++;
for(int i=1;i<=n;i++)
{
if(!in[i])dfs(i);
}
for(int i=1;i<=n;i++)
{
if(!visit[i])res=inf,dfs2(i);
}
printf("%d\n",ans);
return 0;
}