Advertisement
Sylv3rWolf

aizlab7poprawione

Nov 17th, 2015
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.92 KB | None | 0 0
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6. package aiz7;
  7.  
  8. /**
  9.  *
  10.  * @author MaxSylverWolf
  11.  */
  12. import java.util.*;
  13.  
  14. class Tarjan
  15. {
  16.     //wierzcholki
  17.     private int V;    
  18.  
  19.     private int preCount;
  20.  
  21.     private int[] low;
  22.     //odwiedzanie
  23.     private boolean[] visited;      
  24.     //lista utworzonego grafu
  25.     private List<Integer>[] graph;
  26.     //wszystkie silnie/elementy maksymalne(najwięcej połączeń)
  27.     private List<List<Integer>> sccComp;
  28.     private Stack<Integer> stack;
  29.  
  30.     //Silnia składowa grafu
  31.     public List<List<Integer>> getSCComponents(List<Integer>[] graph)
  32.     {
  33.         V = graph.length;
  34.         this.graph = graph;
  35.         low = new int[V];
  36.         visited = new boolean[V];
  37.         stack = new Stack<Integer>();
  38.         sccComp = new ArrayList<>();
  39.  
  40.         for (int v = 0; v < V; v++)
  41.               if (!visited[v])
  42.                 dfs(v);
  43.  
  44.         return sccComp;
  45.     }
  46.     //Algorytm DFS, przeszukiwanie w głąb
  47.     public void dfs(int v)
  48.     {
  49.         low[v] = preCount++;
  50.         visited[v] = true;
  51.         stack.push(v);
  52.         int min = low[v];
  53.         for (int w : graph[v])
  54.         {
  55.             if (!visited[w])
  56.                 dfs(w);
  57.             if (low[w] < min)
  58.                 min = low[w];
  59.         }
  60.         if (min < low[v])
  61.         {
  62.             low[v] = min;
  63.             return;
  64.         }        
  65.         List<Integer> component = new ArrayList<Integer>();
  66.         int w;
  67.         do
  68.         {
  69.             w = stack.pop();
  70.             component.add(w);
  71.             low[w] = V;                
  72.         } while (w != v);
  73.         sccComp.add(component);        
  74.     }    
  75.    
  76.     public static void main(String[] args)
  77.     {    
  78.         Scanner scan = new Scanner(System.in);
  79.         System.out.println("SCC test:\n");
  80.         System.out.println("Liczba wierzchołków: ");
  81.        
  82.         int V = scan.nextInt();
  83.  
  84.         //tworze graf
  85.         List<Integer>[] g = new List[V];        
  86.         for (int i = 0; i < V; i++)
  87.             g[i] = new ArrayList<Integer>();        
  88.         // krawędzie
  89.         System.out.println("\nLiczba krawędzi");
  90.         int E = scan.nextInt();
  91.         //krawędzie
  92.         System.out.println("Podaj "+ E +" x, y elementy: ");
  93.         for (int i = 0; i < E; i++)
  94.         {
  95.             int x = scan.nextInt();
  96.             int y = scan.nextInt();
  97.             g[x].add(y);
  98.         }
  99.  
  100.         System.out.println("Graf:");
  101.          for (int i = 0; i < V; i++)
  102.          System.out.println(i+"|"+g[i]);
  103.  
  104.         Tarjan t = new Tarjan();        
  105.         System.out.println("SCC : ");
  106.         //WSZYSTKIE SCC / czyli te silnie
  107.         List<List<Integer>> scComponents = t.getSCComponents(g);
  108.            System.out.println(scComponents);        
  109.     }    
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement