Guest User

Untitled

a guest
Apr 25th, 2012
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.70 KB | None | 0 0
  1.  
  2. package javaapplication14;
  3.  
  4. import com.sun.xml.internal.ws.api.pipe.NextAction;
  5. import java.io.BufferedReader;
  6. import java.io.DataInputStream;
  7. import java.io.FileInputStream;
  8. import java.io.InputStreamReader;
  9. import java.util.ArrayList;
  10.  
  11. import java.util.regex.Pattern;
  12.  
  13. /**
  14.  *
  15.  * @author karlo
  16.  */
  17. public class Rcontraction {
  18.  
  19.     public static void main(String arg[]) {
  20.         ArrayList<ArrayList<Integer>> nodes = new ArrayList();
  21.         ArrayList<obj1> edges = new ArrayList();
  22.         ArrayList<Integer> prueba1 = new ArrayList();
  23.         String hola1;
  24.         int hola2;
  25.         int minimo = 99999;
  26.  
  27.  
  28.         try {
  29.             // Open the file that is the first
  30.             // command line parameter
  31.             FileInputStream fstream = new FileInputStream("src/kargerAdj.txt");
  32.             // Get the object of DataInputStream
  33.             DataInputStream in = new DataInputStream(fstream);
  34.             BufferedReader br = new BufferedReader(new InputStreamReader(in));
  35.             String strLine;
  36.             //Read File Line By Line
  37.             while ((strLine = br.readLine()) != null) {
  38.                 // Print the content on the console
  39.                 hola1 = (strLine);
  40.                 Pattern split = Pattern.compile("[,\\s]+");
  41.                 String[] result = split.split(hola1);
  42.  
  43.                 prueba1 = new ArrayList();
  44.                 for (int i = 1; i < result.length; i++) {
  45.                     prueba1.add(Integer.parseInt(result[i]));
  46.                 }
  47.                 nodes.add(prueba1);
  48.  
  49.             }
  50.             //Close the input stream
  51.             in.close();
  52.         } catch (Exception e) {//Catch exception if any
  53.             System.err.println("Error: " + e.getMessage());
  54.         }
  55.  
  56.  
  57.  
  58.  
  59.  
  60.         try {
  61.             // Open the file that is the first
  62.             // command line parameter
  63.             FileInputStream fstream = new FileInputStream("src/edges.txt");
  64.             // Get the object of DataInputStream
  65.             DataInputStream in = new DataInputStream(fstream);
  66.             BufferedReader br = new BufferedReader(new InputStreamReader(in));
  67.             String strLine;
  68.             //Read File Line By Line
  69.             while ((strLine = br.readLine()) != null) {
  70.                 // Print the content on the console
  71.                 hola1 = (strLine);
  72.                 Pattern split = Pattern.compile("[,\\s]+");
  73.                 String[] result = split.split(hola1);
  74.  
  75.                 obj1 hola = new obj1();
  76.                 hola.setNum1(Integer.parseInt(result[0]));
  77.                 hola.setNum2(Integer.parseInt(result[1]));
  78.                 edges.add(hola);
  79.  
  80.             }
  81.             //Close the input stream
  82.             in.close();
  83.         } catch (Exception e) {//Catch exception if any
  84.             System.err.println("Error: " + e.getMessage());
  85.         }
  86.  
  87.  
  88.         int p = 1;
  89.         ArrayList<ArrayList<Integer>> nodesfinal = new ArrayList();
  90.         ArrayList<ArrayList<Integer>> nodesminimo = new ArrayList();
  91.         while (p < 1000000) {
  92.             nodesfinal = new ArrayList();
  93.  
  94.             nodesfinal = RandomContraction(nodes, edges);
  95.  
  96.             if (minimo > nodesfinal.get(0).size()) {
  97.                 minimo = nodesfinal.get(0).size();
  98.                 nodesminimo = nodesfinal;
  99.             } else if (minimo > nodesfinal.get(1).size()) {
  100.                 minimo = nodesfinal.get(1).size();
  101.                 nodesminimo = nodesfinal;
  102.             }
  103.             p++;
  104.         }
  105.  
  106.  
  107.         System.out.println(minimo);
  108.         System.out.println(nodesminimo);
  109.  
  110.     }
  111.  
  112.     private static ArrayList<ArrayList<Integer>> RandomContraction(ArrayList<ArrayList<Integer>> nodes, ArrayList<obj1> edges) { //agregar entrada es un grafo
  113. //         ArrayList<ArrayList<Integer>> nodes = new ArrayList();
  114. //         ArrayList<obj1> edges = new ArrayList();        
  115.         try {
  116.                    while (nodes.size() > 2) {
  117.             int numberEdgeToMerge = (int) Math.floor(edges.size() * Math.random());
  118.             obj1 edgeToMerge = new obj1();
  119.             obj1 edgeToMerge2 = new obj1();
  120.             edgeToMerge.setNum1(edges.get(numberEdgeToMerge).getNum1());
  121.             edgeToMerge.setNum2(edges.get(numberEdgeToMerge).getNum2());
  122.             edgeToMerge2.setNum1(edges.get(numberEdgeToMerge).getNum1());
  123.             edgeToMerge2.setNum2(edges.get(numberEdgeToMerge).getNum2());
  124.  
  125.             //juntar esos
  126.  
  127.  
  128.             for (int i = 0; i < nodes.size(); i++) {
  129.                 if (nodes.get(i).get(0) == edgeToMerge.getNum1()) {
  130.                     edgeToMerge.setNum1(i + 1);
  131.                 } else if (nodes.get(i).get(0) == edgeToMerge.getNum2()) {
  132.                     edgeToMerge.setNum2(i + 1);
  133.                 }
  134.             }
  135.  
  136.  
  137.             // juntar los nodos vecinos de los 2 nodos del edge seleccionado
  138.             try {
  139.                 nodes.get(edgeToMerge.getNum1() - 1).addAll(nodes.get(edgeToMerge.getNum2() - 1).subList(1, nodes.get(edgeToMerge.getNum2() - 1).size()));
  140.             } catch (java.lang.IndexOutOfBoundsException e) {
  141.                
  142.             }
  143.             for (int i = 0; i < edges.size(); i++) { //para cada nodo
  144.                 if (edges.get(i).getNum1() == edgeToMerge2.getNum2()) {
  145.                     edges.get(i).setNum1(edgeToMerge2.getNum1());
  146.                 } else if (edges.get(i).getNum2() == edgeToMerge2.getNum2()) {
  147.                     edges.get(i).setNum2(edgeToMerge2.getNum1());
  148.                 }
  149.             }
  150.  
  151.             // quitar repeticiones
  152.             for (int i = 0; i < nodes.size(); i++) { //para cada nodo
  153.                 for (int j = 1; j < nodes.get(i).size(); j++) { // para cada vecino del nodo
  154.                     if (nodes.get(i).get(j) == edgeToMerge2.getNum2()) {    //si estaba conectado al segundo nodo combinado
  155.                         nodes.get(i).set(j, edgeToMerge2.getNum1());        //se cambia de nombre para estar conectado al segundo
  156.                     }
  157.                 }
  158.             }
  159.             for (int i = 1; i < nodes.get(edgeToMerge.getNum1() - 1).size(); i++) {
  160.                 if (nodes.get(edgeToMerge.getNum1() - 1).get(i) == edgeToMerge2.getNum1()) {
  161.                     nodes.get(edgeToMerge.getNum1() - 1).remove(i);
  162.                     i--;
  163.                 }
  164.             }
  165.             //borrar ese edge de la lista de edges
  166.             edges.remove(numberEdgeToMerge);
  167.  
  168.             try {
  169.                 nodes.remove(edgeToMerge.getNum2() - 1);
  170.             } catch (java.lang.IndexOutOfBoundsException e) {
  171.                
  172.             }
  173.             //borrar ese nodo
  174.         }
  175.         return nodes; //que regrese el minimo de cruces
  176.         } catch (Exception e) {
  177.             return nodes;
  178.         }
  179.  
  180.        
  181.     }
  182. }
Advertisement
Add Comment
Please, Sign In to add comment