Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.66 KB | None | 0 0
  1. package jmetal.util;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map.Entry;
  7.  
  8. //Questa classe rappresenta un arco tra due nodi chiamati A e B
  9. //Per verificare la raggiungibilità di un nodo si considerano i due "punti" dell'arco, vertexA e vertexB
  10. public class Edge implements Comparable<Edge> {
  11.    
  12.     char vertexA;
  13.        
  14.     char vertexB;
  15.    
  16.     int weigth;
  17.    
  18.     public Edge(char vertexA, char vertexB, int weigth)
  19.     {
  20.         if (vertexA == vertexB)
  21.             throw new IllegalArgumentException("Vertex must be different");
  22.         this.vertexA = vertexA;
  23.         this.vertexB = vertexB;
  24.         this.weigth = weigth;
  25.     }
  26.    
  27.     public char getVertexA()
  28.     {
  29.         return vertexA;
  30.     }
  31.        
  32.     public char getVertexB()
  33.     {
  34.         return vertexB;
  35.     }
  36.    
  37.     public int getWeigth()
  38.     {
  39.         return weigth;
  40.     }
  41.  
  42.     public static int getWeigth(List<Edge> edges)
  43.     {
  44.         int result = 0;
  45.         for (Edge e : edges)
  46.         {
  47.             result += e.getWeigth();
  48.         }
  49.         return result;
  50.     }  
  51.  
  52.     public boolean Reaches(char node)
  53.     {
  54.         if (node == vertexA)
  55.             return true;
  56.         if (node == vertexB)
  57.             return true;
  58.         return false;
  59.     }      
  60.  
  61.     public boolean Reaches(List<Character> vertexes)
  62.     {
  63.         for (Character v : vertexes)
  64.         {
  65.             if (v == vertexA)
  66.                 return true;
  67.             if (v == vertexB)
  68.                 return true;           
  69.         }
  70.         return false;
  71.     }  
  72.  
  73.     public char OtherEndpoint(char node)
  74.     {
  75.         if (node == vertexA)
  76.             return vertexB;
  77.         if (node == vertexB)
  78.             return vertexA;
  79.         throw new IllegalArgumentException("Node must be one of the endpoints");
  80.     }
  81.    
  82.     public char OtherEndpoint(List<Character> vertexes)
  83.     {
  84.         for (Character v : vertexes)
  85.         {
  86.             if (v == vertexA)
  87.                 return vertexB;
  88.             if (v == vertexB)
  89.                 return vertexA;        
  90.         }
  91.         throw new IllegalArgumentException("vertexes must contain one of the endpoints");
  92.     }
  93.    
  94.     public boolean Touch(List<Character> vertexes)
  95.     {
  96.         int count = 0;
  97.         for (Character v : vertexes)
  98.         {
  99.             if (Reaches(v))
  100.                 count ++;  
  101.         }
  102.         if (count == 1)
  103.             return true;
  104.         else
  105.             return false;
  106.     }
  107.    
  108.     public String toString()
  109.     {
  110.         return vertexA + "-" + vertexB + " (" + weigth + ")";
  111.     }
  112.    
  113.     public static List<Edge> Touch(List<Edge> edges, List<Character> vertexes)
  114.     {
  115.         ArrayList<Edge> result = new ArrayList<Edge>();
  116.         for (Edge e : edges)
  117.         {
  118.             if (e.Touch(vertexes))
  119.             {
  120.                 result.add(e);
  121.             }
  122.         }
  123.         return result;
  124.     }
  125.  
  126.     @Override
  127.     public int compareTo(Edge other){
  128.         return weigth - other.getWeigth();
  129.     }  
  130.    
  131.     public static List<Character> getLeaves(List<Edge> edges)
  132.     {
  133.         List<Character> result = new ArrayList<Character>();
  134.         HashMap<Character, Integer> map = new HashMap<Character,Integer>();          
  135.         for (Edge e : edges)
  136.         {
  137.            char c = e.getVertexA();
  138.            Integer val = map.get(new Character(c));
  139.            if(val != null)
  140.            {
  141.                map.put(c, new Integer(val + 1));
  142.            } else {
  143.                map.put(c, 1);
  144.            }
  145.            c = e.getVertexB();
  146.            val = map.get(new Character(c));
  147.            if(val != null)
  148.            {
  149.                map.put(c, new Integer(val + 1));
  150.            } else {
  151.                map.put(c, 1);
  152.            }           
  153.         }
  154.         for (Entry<Character, Integer> entry : map.entrySet()) {
  155.             Character key = entry.getKey();
  156.             Integer value = entry.getValue();
  157.             if (value == 1)
  158.                 result.add(key);
  159.         }
  160.         return result;
  161.     }
  162.    
  163.     public static int getMinWeight(List<Edge> edges)
  164.     {
  165.         int result = Integer.MAX_VALUE;
  166.         for (Edge e : edges)
  167.         {
  168.             if (e.getWeigth() < result)
  169.                 result = e.getWeigth();
  170.         }
  171.         return result;
  172.     }
  173.    
  174.     public static boolean DetectLoop(List<Edge> edges)
  175.     {
  176.         List<Character> reached_nodes = new ArrayList<>();
  177.         for (Edge e : edges)
  178.         {
  179.             if (reached_nodes.contains((Character)e.getVertexA()) && reached_nodes.contains((Character)e.getVertexB()))
  180.                     return true;
  181.             else
  182.             {
  183.                 if (!reached_nodes.contains((Character)e.getVertexA()))
  184.                         reached_nodes.add((Character)e.getVertexA());
  185.                 if (!reached_nodes.contains((Character)e.getVertexB()))
  186.                     reached_nodes.add((Character)e.getVertexB());
  187.                
  188.             }
  189.         }
  190.         return false;
  191.     }
  192.  
  193.     public static boolean _detectLoop(List<Edge> edges, List<Character> reached_nodes)
  194.     {
  195.         return false;
  196.     }
  197.    
  198.     public static int FindLeaves(List<Edge> edges)
  199.     {
  200.         int result = 0;
  201.         HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
  202.         for (Edge e : edges)
  203.         {
  204.             if (!hm.containsKey(e.getVertexA()))
  205.                 hm.put(e.getVertexA(), 1);
  206.             else
  207.                 hm.put(e.getVertexA(), hm.get(e.getVertexA())+1);
  208.            
  209.             if (!hm.containsKey(e.getVertexB()))
  210.                 hm.put(e.getVertexB(), 1);
  211.             else
  212.                 hm.put(e.getVertexB(), hm.get(e.getVertexB())+1);
  213.         }
  214.         for (Character c : hm.keySet())
  215.         {
  216.             if (hm.get(c) == 1)
  217.                 result++;
  218.         }
  219.         return result;
  220.     }
  221.    
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement