题目:1977. 信息中继
方法一:并查集。我们将可以互相联系的奶牛用并查集合并在一起,做完这些操作后。循环遍历一遍,看看最后合并在一起的奶牛里最后一头奶牛是否还可以联系别的奶牛(也就是输入f[i]是0的话,这一队奶牛不会陷入循环)
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int ,int > PII;
typedef long long LL;
const int N=1e3+10;
const int mod=1e9;
int p[N],f[N];
int findd(int u){
if(p[u]!=u) return p[u]=findd(p[u]);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
p[i]=i;
}
for(int i=1;i<=n;i++){
cin>>f[i];
if(f[i]){
p[findd(i)]=findd(f[i]);
}
}
int ans=0;
for(int i=1;i<=n;i++){
if(f[findd(i)]==0) ans++;
}
cout<<ans;
return 0;
}
方法二:暴力遍历。先将输入全部读入,然后遍历每一头奶牛,看看遍历一遍会不会又回到最初的原点(这里用bool来标记是否被遍历过)。
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int ,int > PII;
typedef long long LL;
const int N=1e3+10;
const int mod=1e9;
int f[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>f[i];
}
int ans=0;
for(int i=1;i<=n;i++){
bool sta[N];
memset(sta,0,sizeof sta);
int t=f[i];
while(t!=0&&!sta[t]){
sta[t]=1;
t=f[t];
}
if(t==0) ans++;
}
cout<<ans;
return 0;
}