这道题和上一道题一样,感觉都是很好的贪心题。但是我太菜了我不会啊55555...
附上大佬博客Orz:https://www.cnblogs.com/tyty-Somnuspoppy/p/7454898.html
看注释吧,附上AC代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX=100005;
int p[MAX],q[MAX];
int ans=0;
void dfs(int i)
{
if(p[i])
{
ans++;
dfs(p[i]);//先dfs
p[i]=0;//再更新值
}
}
int main()
{
int n;
while(scanf("%d",&n)==1)
{
for(int i=1;i<=n;i++)
scanf("%d",&p[i]);
for(int i=1;i<=n;i++)
scanf("%d",&q[i]);
int k1,k2;
ans=0;
for(int i=1;i<=n;i++)
{
if(p[i]==q[i])
continue;
if(p[i])//若a的父亲改变,则必须打开套在a外面的所有娃娃,使它自由
dfs(i);
if(p[q[i]])//若a变为b新的父亲,则必须打开套在a外面的所有娃娃,使它自由
dfs(q[i]);
}
for(int i=1;i<=n;i++)//所有要改变的娃娃都变成了自由,依次嵌套即可
{
if(p[i]!=q[i])
ans++;
}
printf("%d\n",ans);
}
return 0;
}