思路:一看题目给的数据,就想起来并查集,将并查集的find()函数简单修改即可达到要求。(但是我使用Java写的无法通过,显示答案错误,同样的方法在C++中却得以全部通过,让我很是疑惑)
核心部分
static int[] map; // 输入数据
static int[] record; // 记录辈分
static int find(int val) {
if (record[val] != 0) {
// 辈分已经知道,直接退出
return record[val];
}
if (map[val] == -1) {
// 是老祖宗
return record[val] = 1;
}
// 不是老祖宗,继续往下找,并确定自己的辈分
return record[val] = find(map[val]) + 1;
}
Java代码(没有通过,答案错误)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
Reader.init(System.in);
int N = Reader.nextInt();
map = new int[100005]