Advertisement
madopew

Untitled

May 1st, 2020
436
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.30 KB | None | 0 0
  1. package kz.logic;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileReader;
  6. import java.util.ArrayList;
  7. import java.util.Scanner;
  8.  
  9. public class Main {
  10.     private static Scanner scanner = new Scanner(System.in);
  11.     private static Plot plot;
  12.     private static ArrayList<Vertex> graph;
  13.     private static ArrayList<Vertex> clique;
  14.     public static Plot getPlot() {
  15.         return plot;
  16.     }
  17.     public static void main(String[] args) {
  18.         graph = new ArrayList<Vertex>();
  19.         clique = new ArrayList<Vertex>();
  20.         displayMainMenu();
  21.     }
  22.    
  23.     private static void displayMainMenu() {
  24.         System.out.println("========");
  25.         System.out.println("LABA 7 1");
  26.         System.out.println("========");
  27.         System.out.println("Choose option by picking a number.");
  28.         System.out.println("1) Show graph");
  29.         System.out.println("2) Add vertices");
  30.         System.out.println("3) Add vertices (file)");
  31.         System.out.println("4) Exit");
  32.         int picked = 0;
  33.         try {
  34.             picked = Integer.parseInt(scanner.nextLine());
  35.         } catch (Exception e) {
  36.             displayMainMenu();
  37.             return;
  38.         }
  39.         if(picked < 1 || picked > 4) {
  40.             displayMainMenu();
  41.             return;
  42.         }
  43.         switch(picked) {
  44.         case 1:
  45.             showGraph();
  46.             return;
  47.         case 2:
  48.             addVertices();
  49.             return;
  50.         case 3:
  51.             addVerticesFile();
  52.             return;
  53.         case 4:
  54.             System.out.println("The program has now terminated.");
  55.             return;
  56.         }
  57.     }
  58.    
  59.     private static void showGraph() {
  60.         extendClique();
  61.         plot = new Plot(graph, clique);
  62.         System.out.println("Loading...");
  63.         Renderer.init();
  64.     }
  65.    
  66.     private static void extendClique() {
  67.         ArrayList<Vertex> candidates = new ArrayList<Vertex>(graph);
  68.         ArrayList<Vertex> not = new ArrayList<Vertex>();
  69.         ArrayList<Vertex> compsub = new ArrayList<Vertex>();
  70.         extendClique(candidates, not, compsub);
  71.     }
  72.    
  73.     // алгоритм Брона-Кербоша O(3^(n/3))
  74.     private static void extendClique(ArrayList<Vertex> candidates, ArrayList<Vertex> not, ArrayList<Vertex> compsub) {
  75.         while(!candidates.isEmpty() && !adjacentToAll(not, candidates)) {
  76.             Vertex v = candidates.get(0);
  77.             compsub.add(v);
  78.             ArrayList<Vertex> newCandidates = removeNotAdjacent(candidates, v);
  79.             ArrayList<Vertex> newNot = removeNotAdjacent(not, v);
  80.             if(!newCandidates.isEmpty() || !newNot.isEmpty())
  81.                 extendClique(newCandidates, newNot, compsub);
  82.             else {
  83.                 if(compsub.size() > clique.size())
  84.                     clique = new ArrayList<Vertex>(compsub);
  85.             }
  86.             compsub.remove(v);
  87.             candidates.remove(v);
  88.             not.add(v);
  89.         }
  90.     }
  91.    
  92.     private static ArrayList<Vertex> removeNotAdjacent(ArrayList<Vertex> verteces, Vertex v) {
  93.         ArrayList<Vertex> newVerteces = new ArrayList<Vertex>();
  94.         for(int i = 0; i < verteces.size(); i++) {
  95.             int[] adjacent = verteces.get(i).getVertices();
  96.             boolean connected = false;
  97.             for(int j = 0; j < adjacent.length; j++) {
  98.                 if(adjacent[j] == v.getIndex()) {
  99.                     connected = true;
  100.                     break;
  101.                 }
  102.             }
  103.             if(connected)
  104.                 newVerteces.add(verteces.get(i));
  105.         }
  106.         return newVerteces;
  107.     }
  108.    
  109.     private static boolean adjacentToAll(ArrayList<Vertex> first, ArrayList<Vertex> second) {
  110.         if(first.isEmpty() || second.isEmpty())
  111.             return false;
  112.         for(int i = 0; i < first.size(); i++) {
  113.             int[] vertices = first.get(i).getVertices();
  114.             if(vertices.length != second.size())
  115.                 continue;
  116.             boolean connected = true;
  117.             for(int j = 0; j < second.size(); j++) {
  118.                 if(!contains(vertices, second.get(j).getIndex())) {
  119.                     connected = false;
  120.                     break;
  121.                 }
  122.             }
  123.             if(connected)
  124.                 return true;
  125.         }
  126.         return false;
  127.     }
  128.    
  129.     private static boolean contains(int[] arr, int value) {
  130.         for(int i = 0; i < arr.length; i++) {
  131.             if(arr[i] == value)
  132.                 return true;
  133.         }
  134.         return false;
  135.     }
  136.    
  137.     private static void addVertices() {
  138.         graph.clear();
  139.         int amount = inputFunc("amount of vertices", 2, 11);
  140.         for(int i = 0; i < amount; i++) {
  141.             ArrayList<Integer> connections = new ArrayList<Integer>();
  142.             for(int j = 0; j < amount; j++) {
  143.                 int adjacent = inputFunc("adjacent value of vertices " + i + "-" + j, 0, 2);
  144.                 if(adjacent == 1 && i != j)
  145.                     connections.add(j);
  146.                 else if(adjacent == 1) {
  147.                     System.out.println("Vertex cannot be loopped! Adjacent value changed to zero");
  148.                     adjacent = 0;
  149.                 }
  150.             }
  151.             graph.add(new Vertex(i, connections));
  152.         }
  153.         System.out.println("Vertices successfully added.");
  154.         displayIncidentMatrix();
  155.         displayMainMenu();
  156.     }
  157.    
  158.     private static void displayIncidentMatrix() {
  159.         System.out.println("\n======MATRIX======");
  160.         for(int i = 0; i < graph.size(); i++) {
  161.             System.out.print(i + ": ");
  162.             int[] v = graph.get(i).getVertices();
  163.             for(int j = 0; j < v.length; j++) {
  164.                 System.out.print(v[j] + " ");
  165.             }
  166.             System.out.println("");
  167.         }
  168.         System.out.println("==================\n");
  169.     }
  170.    
  171.     private static int inputFunc(String name, int min, int max) {
  172.         boolean incorrect;
  173.         String line;
  174.         int element = 0;
  175.         do {
  176.             incorrect = false;
  177.             System.out.println("Input " + name + ":");
  178.             line = scanner.nextLine();
  179.             try {
  180.                 element = Integer.parseInt(line);
  181.             } catch (Exception e) {
  182.                 incorrect = true;
  183.                 System.out.println("Element should be a numerical value");
  184.             }
  185.             if(element < min || element >= max) {
  186.                 incorrect = true;
  187.                 System.out.printf("Element should be between %d and %d\n", min, max - 1);
  188.             }
  189.         } while(incorrect);
  190.         return element;
  191.     }
  192.    
  193.     private static void addVerticesFile() {
  194.         graph.clear();
  195.         System.out.println("Input location of the file:");
  196.         String line;
  197.         try (BufferedReader br = new BufferedReader(new FileReader(new File(scanner.nextLine())))) {
  198.             line = br.readLine();
  199.             int amount = Integer.parseInt(line);
  200.             for(int i = 0; i < amount; i++) {
  201.                 line = br.readLine();
  202.                 ArrayList<Integer> connections = new ArrayList<Integer>();
  203.                 for(int j = 0; j < amount; j++) {
  204.                     int adjacent = line.charAt(j) - '0';
  205.                     if(adjacent == 1 && i != j)
  206.                         connections.add(j);
  207.                     else if(adjacent == 1) {
  208.                         System.out.println("Vertex cannot be loopped! Adjacent value changed to zero");
  209.                         adjacent = 0;
  210.                     }
  211.                 }
  212.                 graph.add(new Vertex(i, connections));
  213.             }
  214.         } catch(Exception e) {
  215.             e.printStackTrace();
  216.             System.out.println("An error has occured.");
  217.             displayMainMenu();
  218.             return;
  219.         }
  220.         System.out.println("Vertices successfully added.");
  221.         displayIncidentMatrix();
  222.         displayMainMenu();
  223.     }
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement