Advertisement
Guest User

Untitled

a guest
Mar 24th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.51 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class MaxComponent implements Comparable<MaxComponent> {
  5.     private int vertexes;
  6.     private int edges;
  7.     private int mi_vertex;
  8.  
  9.     private MaxComponent(int vertexes, int edges, int mi_vertex) {
  10.         this.vertexes = vertexes;
  11.         this.edges = edges;
  12.         this.mi_vertex = mi_vertex;
  13.     }
  14.  
  15.     private void dfs(int v, List<Integer>[] graph, boolean[] used) {
  16.         used[v] = true;
  17.         vertexes++;
  18.         mi_vertex = v;
  19.         for (int i = 0; i < graph[v].size(); i++) {
  20.             edges++;
  21.  
  22.             if (graph[v].get(i) < mi_vertex)
  23.                 mi_vertex = graph[v].get(i);
  24.             if (!used[graph[v].get(i)]) {
  25.                 dfs(graph[v].get(i), graph, used);
  26.             }
  27.         }
  28.     }
  29.  
  30.     private void bfs(boolean[] f_used, boolean[] s_used, List<Integer>[] graph, boolean flag, PrintWriter out) {
  31.         Deque<Integer> deque = new ArrayDeque<>();
  32.         deque.add(mi_vertex);
  33.  
  34.         while (!deque.isEmpty()) {
  35.             int v = deque.poll();
  36.  
  37.             if (!s_used[v]) {
  38.                 if (!flag) {
  39.                     out.println(v);
  40.                 } else {
  41.                     out.println(v + " [color = red]");
  42.                 }
  43.             }
  44.  
  45.             s_used[v] = true;
  46.  
  47.             for (int to : graph[v]) {
  48.                 if (!f_used[to] && !f_used[v]) {
  49.                     deque.add(to);
  50.  
  51.                     if (!flag) {
  52.                         out.println(v + " -- " + to);
  53.                     } else {
  54.                         out.println(v + " -- " + to + " [color = red]");
  55.                     }
  56.                 }
  57.             }
  58.  
  59.             f_used[v] = true;
  60.         }
  61.     }
  62.  
  63.     @Override
  64.     public int compareTo(MaxComponent o) {
  65.         if (vertexes < o.vertexes)
  66.             return 1;
  67.         else if (vertexes > o.vertexes)
  68.             return -1;
  69.         else if (edges < o.edges)
  70.             return 1;
  71.         else if (edges > o.edges)
  72.             return -1;
  73.         else if (mi_vertex > o.mi_vertex)
  74.             return 1;
  75.         return -1;
  76.     }
  77.  
  78.     public static class Reader {
  79.         static BufferedReader reader;
  80.         static StringTokenizer tokenizer;
  81.  
  82.         /** call this method to initialize reader for InputStream */
  83.         static void init(InputStream input) {
  84.             reader = new BufferedReader(
  85.                     new InputStreamReader(input) );
  86.             tokenizer = new StringTokenizer("");
  87.         }
  88.  
  89.         /** get next word */
  90.         static String next() throws IOException {
  91.             while ( ! tokenizer.hasMoreTokens() ) {
  92.                 //TODO add check for eof if necessary
  93.                 tokenizer = new StringTokenizer(
  94.                         reader.readLine() );
  95.             }
  96.             return tokenizer.nextToken();
  97.         }
  98.  
  99.         static int nextInt() throws IOException {
  100.             return Integer.parseInt( next() );
  101.         }
  102.  
  103.         static double nextDouble() throws IOException {
  104.             return Double.parseDouble( next() );
  105.         }
  106.     }
  107.  
  108.     public static void main(String[] args) throws Exception {
  109.         Reader.init(System.in);
  110.  
  111.         int n = Reader.nextInt();
  112.         int m = Reader.nextInt();
  113.  
  114.         List<Integer>[] graph = new List[n];
  115.  
  116.         for (int i = 0; i < n; i++) {
  117.             graph[i] = new ArrayList<>();
  118.         }
  119.  
  120.         for(int i = 0; i < m; i++) {
  121.             int from = Reader.nextInt();
  122.             int to = Reader.nextInt();
  123.  
  124.             if (from == to) {
  125.                 graph[from].add(to);
  126.             } else {
  127.                 graph[from].add(to);
  128.                 graph[to].add(from);
  129.             }
  130.         }
  131.  
  132.         List<MaxComponent> components = new ArrayList<>();
  133.         boolean[] used = new boolean[n];
  134.  
  135.         for (int i = 0; i < n; i++) {
  136.             if (!used[i]) {
  137.                 MaxComponent temp = new MaxComponent(0, 0, i);
  138.                 temp.dfs(i, graph, used);
  139.                 components.add(temp);
  140.             }
  141.         }
  142.  
  143.         components.sort(MaxComponent::compareTo);
  144.  
  145.         PrintWriter pw = new PrintWriter(System.out);
  146.  
  147.         pw.println("graph {");
  148.  
  149.         Arrays.fill(used, false);
  150.         boolean[] s_used = new boolean[n];
  151.  
  152.         components.get(0).bfs(used, s_used, graph, true, pw);
  153.  
  154.         for (int i = 1; i < components.size(); i++) {
  155.             components.get(i).bfs(used, s_used, graph, false, pw);
  156.         }
  157.  
  158.         pw.println("}");
  159.         pw.flush();
  160.         pw.close();
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement