题目:
-
班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,
每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为1,2,3,…N
输入
输入第一行,一个整数N(3<N<100000)
接下来一行N个整数,由空格分开。
输出
要求输出一个整数,表示满足条件的最大圈的人数。
样例输入:
9
3 4 2 5 3 8 4 6 9
样例输出:
4
-
思路:通过递归查找对应结点的方式,flag[]记录每个结点的对应位置,如果该结点未被记录,则说明未经过该结点,反之亦然,直到找到重复记录的结点,说明出现循环,并且重复的结点为循环开始结点,然后在该点进行递归,进一步计算出结点数,同时flagCircle[]标记下处于循环体中的数的位置,然后在回溯时将未处于循环体中的数的flag[]标记为0,防止重复.
#include<stdio.h>
#define MAXSIZE 100000 //最大数
int fa[MAXSIZE], flag[MAXSIZE], flagCircle[MAXSIZE];
//fa[]表示祖先结点//flag[]记录对应结点位置,判断是否重复出现(循环)
//flagCircle[]记录标记循环内的每个元素 不在循环之中的标记为0 在循环之中的标记为1
int Count(int i, int m, int count