0
点赞
收藏
分享

微信扫一扫

信息中继(春季每日一题 38)

农夫约翰有 信息中继(春季每日一题 38)_基环树 头奶牛,编号 信息中继(春季每日一题 38)_并查集_02

通过使用易拉罐和绳子构成的土制电话,它们会在约翰不注意的时候相互通信。

每头奶牛最多可以将消息转发给另一头奶牛:

对于奶牛 信息中继(春季每日一题 38)_i++_03,它会将自己收到的任何信息转发给奶牛 信息中继(春季每日一题 38)_基环树_04信息中继(春季每日一题 38)_基环树_05信息中继(春季每日一题 38)_i++_03 一定不同)。

如果 信息中继(春季每日一题 38)_基环树_05信息中继(春季每日一题 38)_并查集_08,则奶牛 信息中继(春季每日一题 38)_i++_03 不转发消息。

不幸的是,奶牛们意识到来自某些奶牛的消息可能最终陷入循环之中,不断地被转发。

请确定所有奶牛中有多少只奶牛发出的消息不会永远陷入循环之中。

输入格式
第一行包含整数 信息中继(春季每日一题 38)_基环树

接下来 信息中继(春季每日一题 38)_基环树 行,每行包含一个整数 信息中继(春季每日一题 38)_基环树_05

输出格式
输出发出的消息不会陷入循环的奶牛的数量。

数据范围
信息中继(春季每日一题 38)_ios_13
信息中继(春季每日一题 38)_基环树_14

输入样例:

5
0
4
1
5
4

输出样例:

2

样例解释
奶牛 信息中继(春季每日一题 38)_并查集_15 不发送任何信息,因此不会陷入循环。

奶牛 信息中继(春季每日一题 38)_基环树_16 发送信息给奶牛 信息中继(春季每日一题 38)_并查集_15,因此也不会陷入循环。

其他三头奶牛发送的信息都会陷入循环。

可以发现不会进入循环的牛一定与 0 是同一个集合

#include<iostream>

using namespace std;

const int N = 1010;

int n;
int p[N];

int find(int x){
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}

int main(){

cin >> n;
for(int i = 1; i < N; i++) p[i] = i;

for(int i = 1; i <= n; i++){

int x;
cin >> x;
int px = find(x), py = find(i);
if(py < px) swap(py, px);
if(px != py) p[py] = px;
}

int res = 0;
for(int i = 1; i <= n; i++)
if(!find(i)) res++;

cout << res << endl;

return 0;
}


举报

相关推荐

0 条评论