题目描述
军营中 N
名士兵,每个人都有自己最崇拜的一个一名士兵(也可以是自己)。 在一个游戏中,需要士兵们坐一个圈,每个士兵都有自己最崇拜的士兵在他的右手边。 求满足条件的圈最大多少人? 士兵编号为 1,2,3,...N
输入输出格式
输入格式 第一行输入一个整数 N
。 接下来一行 N
个整数,每个整数用一个空格隔开。
输出格式 要求输出一个整数,表示满足条件的最大圈的人数。
输入输出样例1
输入 9
3 4 2 5 3 8 4 6 9
输出 4
输入输出样例2
输入 30
22 28 16 6 27 21 30 1 29 10 9 14 24 11 7 2 8 5 26 4 12 3 25 18 20 19 23 17 13 15
输出 16
说明提示
3<N<100000
#include <iostream>
#include <vector>
using namespace std;
// 函数用于找出满足条件的最大圈的人数
int findMaxCircleSize(vector<int>& soldiers) {
int n = soldiers.size();
int maxCircleSize = 0;
for (int i = 0; i < n; i++) {
int current = i;
int count = 0;
vector<bool> visited(n, false);
// 从当前士兵开始遍历,直到回到起点或者遇到已访问过的士兵
while (!visited[current]) {
visited[current] = true;
current = soldiers[current] - 1; // 找到当前士兵最崇拜的士兵编号
count++;
}
// 如果回到起点,则更新最大圈的人数
if (current == i) {
maxCircleSize = max(maxCircleSize, count);
}
}
return maxCircleSize;
}
int main() {
int N;
cin >> N; // 输入士兵数量
vector<int> soldiers(N);
for (int i = 0; i < N; i++) {
cin >> soldiers[i]; // 输入每个士兵最崇拜的士兵编号
}
int maxCircleSize = findMaxCircleSize(soldiers);
cout << maxCircleSize << endl;
return 0;
}