使用bfs求树的直径,运行超时,90分
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Node{
public int no;
public int step;
public Node(int no, int step) {
this.no = no;
this.step = step;
}
}
public class Main{
private static int n;
private static boolean[][] hasRoad;
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String[] firstLine = scanner.nextLine().split(" ");
int switcherCount = Integer.parseInt(firstLine[0]);
int computerCount = Integer.parseInt(firstLine[1]);
n = switcherCount + computerCount;
hasRoad = new boolean[n + 1][n + 1];
String[] secondLine = scanner.nextLine().split(" ");
for(int i = 0; i < secondLine.length; i++){
int x = Integer.parseInt(secondLine[i]);
hasRoad[i + 2][x] = true;
hasRoad[x][i + 2] = true;
}
String[] thirdLine = scanner.nextLine().split(" ");
for(int i = 0; i < thirdLine.length; i++){
int x = Integer.parseInt(thirdLine[i]);
hasRoad[i + 1 + switcherCount][x] = true;
hasRoad[x][i + 1 + switcherCount] = true;
}
scanner.close();
Node node = bfs(new Node(1, 0));
System.out.println(bfs(node).step);
}
private static Node bfs(Node node){
boolean[] visited = new boolean[n + 1];
Queue<Node> queue = new LinkedList<>();
node.step = 0;
queue.add(node);
visited[node.no] = true;
int maxStep = 0;
Node retNode = null;
while(!queue.isEmpty()){
Node front = queue.poll();
for(int i = 1; i <= n; i++){
if(i == front.no)
continue;
if(!hasRoad[front.no][i])
continue;
if(visited[i])
continue;
visited[i] = true;
Node next = new Node(i, front.step + 1);
queue.add(next);
if(next.step > maxStep){
maxStep = next.step;
retNode = next;
}
}
}
return retNode;
}
}