Advertisement
Guest User

AD1-PA: 5.023s

a guest
May 21st, 2016
576
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.15 KB | None | 0 0
  1. package ad1.ss16.pa;
  2.  
  3. import java.util.*;
  4. import java.util.concurrent.ArrayBlockingQueue;
  5.  
  6. public class Network {
  7.  
  8.     private int N;
  9.     private int M;
  10.  
  11.     private List<Integer> adjList[];
  12.  
  13.     private List<Integer> critical;
  14.     private int[] low;
  15.     private int[] parent;
  16.     private int[] depth;
  17.  
  18.     private int[] cost;
  19.     private boolean changed;
  20.     private int comps;
  21.  
  22.     public class CriticalList implements List<Integer> {
  23.  
  24.         private int count;
  25.         private boolean containArray[];
  26.  
  27.         public CriticalList(int N) {
  28.             containArray = new boolean[N];
  29.             count = 0;
  30.         }
  31.  
  32.         @Override
  33.         public int size() {
  34.             return count;
  35.         }
  36.  
  37.         @Override
  38.         public boolean add(Integer integer) {
  39.             if (!containArray[integer])
  40.                 count++;
  41.  
  42.             containArray[integer] = true;
  43.             return true;
  44.         }
  45.  
  46.         @Override
  47.         public boolean contains(Object o) {
  48.             return containArray[(Integer) o];
  49.         }
  50.  
  51.  
  52.         @Override
  53.         public void clear() {
  54.             Arrays.fill(containArray, false);
  55.             count = 0;
  56.         }
  57.  
  58.         @Override
  59.         public boolean isEmpty() {
  60.             return false;
  61.         }
  62.  
  63.         @Override
  64.         public Iterator<Integer> iterator() {
  65.             return null;
  66.         }
  67.  
  68.         @Override
  69.         public Object[] toArray() {
  70.             return new Object[0];
  71.         }
  72.  
  73.         @Override
  74.         public <T> T[] toArray(T[] a) {
  75.             return null;
  76.         }
  77.  
  78.         @Override
  79.         public boolean remove(Object o) {
  80.             return false;
  81.         }
  82.  
  83.         @Override
  84.         public boolean containsAll(Collection<?> c) {
  85.             return false;
  86.         }
  87.  
  88.         @Override
  89.         public boolean addAll(Collection<? extends Integer> c) {
  90.             return false;
  91.         }
  92.  
  93.         @Override
  94.         public boolean addAll(int index, Collection<? extends Integer> c) {
  95.             return false;
  96.         }
  97.  
  98.         @Override
  99.         public boolean removeAll(Collection<?> c) {
  100.             return false;
  101.         }
  102.  
  103.         @Override
  104.         public boolean retainAll(Collection<?> c) {
  105.             return false;
  106.         }
  107.  
  108.         @Override
  109.         public Integer get(int index) {
  110.             return null;
  111.         }
  112.  
  113.         @Override
  114.         public Integer set(int index, Integer element) {
  115.             return null;
  116.         }
  117.  
  118.         @Override
  119.         public void add(int index, Integer element) {
  120.  
  121.         }
  122.  
  123.         @Override
  124.         public Integer remove(int index) {
  125.             return null;
  126.         }
  127.  
  128.         @Override
  129.         public int indexOf(Object o) {
  130.             return 0;
  131.         }
  132.  
  133.         @Override
  134.         public int lastIndexOf(Object o) {
  135.             return 0;
  136.         }
  137.  
  138.         @Override
  139.         public ListIterator<Integer> listIterator() {
  140.             return null;
  141.         }
  142.  
  143.         @Override
  144.         public ListIterator<Integer> listIterator(int index) {
  145.             return null;
  146.         }
  147.  
  148.         @Override
  149.         public List<Integer> subList(int fromIndex, int toIndex) {
  150.             return null;
  151.         }
  152.     }
  153.  
  154.     @SuppressWarnings("unchecked")
  155.     public Network(int n) {
  156.         N = n;
  157.         adjList = new List[N];
  158.         critical = new CriticalList(N);
  159.         cost = new int[N];
  160.         changed = false;
  161.         comps = -1;
  162.  
  163.         for (int i = 0; i < N; i++) {
  164.             adjList[i] = new LinkedList<>();
  165.         }
  166.  
  167.         Arrays.fill(cost, -1);
  168.  
  169.         low = new int[N];
  170.         parent = new int[N];
  171.         depth = new int[N];
  172.     }
  173.  
  174.     public int numberOfNodes() {
  175.         return N;
  176.     }//O(1)
  177.  
  178.     public int numberOfConnections() {
  179.         return M;
  180.     }//O(1)
  181.  
  182.     public void addConnection(int v, int w) {//(O(n)
  183.         if (v == w)
  184.             return;
  185.         if (!adjList[v].contains((Integer) w)) {
  186.             adjList[w].add(v);
  187.             M++;
  188.             adjList[v].add(w);
  189.             changed = true;
  190.             comps = -1;
  191.         }
  192.     }
  193.  
  194.     public void addAllConnections(int v) {//(O(n)
  195.         boolean[] visited = new boolean[N];
  196.         visited[v] = true;
  197.         for (int i : adjList[v])
  198.             visited[i] = true;
  199.         for (int i = 0; i < N; i++)
  200.             if (!visited[i]) {
  201.                 adjList[i].add(v);
  202.                 M++;
  203.                 adjList[v].add(i);
  204.                 changed = true;
  205.                 comps = -1;
  206.             }
  207.     }
  208.  
  209.     public void deleteConnection(int v, int w) {//O(n)
  210.         if (adjList[v].remove((Integer) w)) {
  211.             adjList[w].remove((Integer) v);
  212.             M--;
  213.             changed = true;
  214.             comps = -1;
  215.         }
  216.     }
  217.  
  218.     public void deleteAllConnections(int v) {//O(n^2)
  219.  
  220.         changed = !adjList[v].isEmpty();
  221.         comps = changed ? -1 : comps;
  222.         M -= adjList[v].size();
  223.  
  224.         for (int w : adjList[v]) {
  225.             adjList[w].remove((Integer) v);
  226.         }
  227.         adjList[v].clear();
  228.     }
  229.  
  230.     public int numberOfComponents() {
  231.  
  232.         if (comps != -1)
  233.             return comps;
  234.  
  235.         criticalNodes();
  236.  
  237.         return comps;
  238.     }//O(n+m)
  239.  
  240.     public boolean hasCycle() {
  241.         return N - M != numberOfComponents();
  242.     }//O(n+m)
  243.  
  244.     public int minimalNumberOfConnections(int start, int end) {
  245.  
  246.         if (cost[start] == 0 && !changed) {
  247.             return cost[end];
  248.         }
  249.         changed = false;
  250.         Arrays.fill(cost, -1);
  251.  
  252.         Queue<Integer> query = new ArrayBlockingQueue<Integer>(N);
  253.  
  254.         cost[start] = 0;
  255.         query.add(start);
  256.  
  257.         while (!query.isEmpty()) {
  258.             int ele = query.remove();
  259.  
  260.             for (int x : adjList[ele]) {
  261.                 if (cost[x] == -1) {
  262.                     cost[x] = cost[ele] + 1;
  263.                     query.add(x);
  264.                 }
  265.             }
  266.         }
  267.  
  268.         return cost[end];
  269.     }//O(n+m)
  270.  
  271.     public List<Integer> criticalNodes() {//O(n+m) //DFS + Check
  272.  
  273.         if (comps != -1)
  274.             return critical;
  275.  
  276.         comps = 0;
  277.         critical.clear();
  278.         Arrays.fill(depth, -1);
  279.  
  280.         for (int i = 0; i < N; i++) {
  281.             if (depth[i] == -1) {
  282.                 parent[i] = -1;
  283.                 Foo(i);
  284.                 comps++;
  285.             }
  286.         }
  287.         return critical;
  288.     }
  289.  
  290.     private void Foo(int i) {
  291.         if (parent[i] == -1)
  292.             depth[i] = low[i] = 0;
  293.         else
  294.             depth[i] = low[i] = depth[parent[i]] + 1;
  295.         int childs = 0;
  296.         boolean is = false;
  297.  
  298.         for (int ni : adjList[i]) {
  299.             if (depth[ni] == -1) {
  300.                 parent[ni] = i;
  301.                 Foo(ni);
  302.                 childs++;
  303.                 if (low[ni] >= depth[i])
  304.                     is = true;
  305.                 if (low[ni] < low[i])
  306.                     low[i] = low[ni];
  307.             } else if (parent[i] != ni) {
  308.                 if (depth[ni] < low[i])
  309.                     low[i] = depth[ni];
  310.             }
  311.         }
  312.  
  313.         if ((parent[i] != -1 && is) || (parent[i] == -1 && childs > 1))
  314.             critical.add(i);
  315.     }
  316. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement