Advertisement
Guest User

Untitled

a guest
May 26th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.11 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class Main implements Runnable {
  5.  
  6.     public void _main() throws IOException {
  7.         int n = nextInt();
  8.         int[] a = new int[n];
  9.         int[] b = new int[n];
  10.         List[] graph = new List[n];
  11.         for (int i = 0; i < n; i++)
  12.             graph[i] = new ArrayList<Integer>();
  13.         for (int i = 0; i < n - 1; i++) {
  14.             a[i] = nextInt() - 1;
  15.             b[i] = nextInt() - 1;
  16.             graph[a[i]].add(b[i]);
  17.             graph[b[i]].add(a[i]);
  18.         }
  19.         int res = 0;
  20.         for (int i = 0; i < n; i++) {
  21.             int[] dist = new int[n];
  22.             int[] prev = new int[n];
  23.             List<Integer> dummy = new ArrayList<Integer>();
  24.             bfs(n, graph, i, dist, prev, dummy);
  25.             for (int j = 0; j < n; j++) {
  26.                 if (i == j) continue;
  27.                 List[] edges = new List[n];
  28.                 for (int k = 0; k < n; k++)
  29.                     edges[k] = new ArrayList<Integer>();
  30.                 boolean[] dead = new boolean[n];
  31.                 dead[i] = true;
  32.                 for (int k = j; k != i; k = prev[k])
  33.                     dead[k] = true;
  34.                 for (int k = 0; k < n; k++)
  35.                     if (!dead[a[k]] && !dead[b[k]]) {
  36.                         edges[a[k]].add(b[k]);
  37.                         edges[b[k]].add(a[k]);
  38.                     }
  39.                 res = Math.max(res, (dist[j] - 1) * diameter(n, edges));
  40.             }
  41.         }
  42.         out.print(res);
  43.     }
  44.    
  45.     void bfs(int n, List[] graph, int start, int[] dist, int[] prev, List<Integer> comp) {
  46.         dist[start] = 1;
  47.         int[] q = new int[n];
  48.         q[0] = start;
  49.         int qt = 0, qh = 1;
  50.         while (qt < qh) {
  51.             int v = q[qt++];
  52.             comp.add(v);
  53.             for (int i = 0; i < graph[v].size(); i++) {
  54.                 int u = (Integer)graph[v].get(i);
  55.                 if (dist[u] == 0) {
  56.                     dist[u] = 1 + dist[v];
  57.                     prev[u] = v;
  58.                     q[qh++] = u;
  59.                 }
  60.             }
  61.         }
  62.     }
  63.  
  64.     int diameter(int n, List[] graph) { //the largest diameter of a connected component
  65.         boolean[] was = new boolean[n];
  66.         int[] dist = new int[n];
  67.         int[] prev = new int[n];
  68.         int res = 0;
  69.         for (int i = 0; i < n; i++)
  70.             if (dist[i] == 0) {
  71.                 List<Integer> comp = new ArrayList<Integer>();
  72.                 bfs(n, graph, i, dist, prev, comp);
  73.                 int best = 0;
  74.                 int bestAt = -1;
  75.                 for (int x : comp) {
  76.                     if (dist[x] > best) {
  77.                         best = dist[x];
  78.                         bestAt = x;
  79.                     }
  80.                     dist[x] = 0;
  81.                     prev[x] = 0;
  82.                 }
  83.                 comp = new ArrayList<Integer>();
  84.                 bfs(n, graph, bestAt, dist, prev, comp);
  85.                 for (int x : comp)
  86.                     res = Math.max(res, dist[x] - 1);
  87.             }
  88.         return res;
  89.     }
  90.  
  91.  
  92.     private BufferedReader in;
  93.     private PrintWriter out;
  94.     private StringTokenizer st;
  95.  
  96.     private String next() throws IOException {
  97.         while (st == null || !st.hasMoreTokens())
  98.             st = new StringTokenizer(in.readLine());
  99.         return st.nextToken();
  100.     }
  101.  
  102.     private int nextInt() throws IOException {
  103.         return Integer.parseInt(next());
  104.     }
  105.  
  106.     private long nextLong() throws IOException {
  107.         return Long.parseLong(next());
  108.     }
  109.  
  110.     private double nextDouble() throws IOException {
  111.         return Double.parseDouble(next());
  112.     }
  113.  
  114.     public static void main(String[] args) {
  115.         new Thread(new Main()).start();
  116.     }
  117.  
  118.     public void run() {
  119.         try {
  120.             in = new BufferedReader(new InputStreamReader(System.in));
  121.             out = new PrintWriter(System.out);
  122.  
  123.             _main();
  124.  
  125.             out.close();
  126.         } catch (Exception e) {
  127.             e.printStackTrace();
  128.             System.exit(202);
  129.         }
  130.     }
  131.  
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement