算法题--崇拜【中等】

题目描述

军营中 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;
}

  • 14
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值