ccf歷年第四題java解答之-201503-4-網路延時(90分)
阿新 • • 發佈:2018-12-05
使用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; } }