大家好,我是晴天学长,很久没有刷题了,现在慢慢的找回手感吧,这是一道基础的dfs的题!💪💪💪
1 )小朋友崇拜圈
2) .算法思路
小朋友崇拜圈
1.接受n个小朋友
2.用一维数组去接收下标为小朋友的崇拜小朋友的编号
3.遍历数组,用dfs去深度搜索,如果能成环,则与max比较,用一个标记数组去标记是否重复循环。
4.输出max
3).代码示例
package LanQiaoTest.DFS;
import java.util.Scanner;
// 9 (9个人)
// 3 4 2 5 3 8 4 6 9 (编号1到9的人崇拜的小朋友的编号)
public class 小朋友崇拜圈 {
static int max = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] N = new int[n + 1];
//
for (int i = 1; i <= n; i++) {
N[i] = scanner.nextInt();
}
//遍历数组
for (int i = 2; i <= n; i++) {
//标记数组
boolean[] st = new boolean[n + 1];
//开头小朋友
int first = i;
dfs(N, i, first, 0, st);
}
System.out.println("最大的环的小朋友人数为" + max+"人");
}
private static void dfs(int[] N, int i, int first, int ans, boolean[] st) {
//找到i的崇拜小朋友的编号
int ob = N[i];
//不能构成一个环
if (st[ob] == true) {
return;
}
st[ob] = true;
ans++;
//检查是否成环
if (ob == first && st[first] == true) {
if (ans > max) {
max = ans;
return;
}
}
//找到小朋友
dfs(N, ob, first, ans, st);
}
}
4).总结
- DFS的遍历方法和结束条件。