Advertisement
Filip_Markoski

[ADSx] - GraphFun

Jan 29th, 2018
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.88 KB | None | 0 0
  1.  
  2. import java.util.Hashtable;
  3. import java.util.LinkedList;
  4. import java.util.NoSuchElementException;
  5. import java.util.Stack;
  6.  
  7.  
  8. public class GraphsFun {
  9.  
  10.     /**
  11.      * Count all possible walks from a source to a destination with exactly k edges
  12.      * https://www.geeksforgeeks.org/count-possible-paths-source-destination-exactly-k-edges/
  13.      */
  14.  
  15.     static final int V = 4; //Number of vertices
  16.  
  17.     // A naive recursive function to count walks
  18.     // from u to v with k edges
  19.     public static int countwalks(int graph[][], int u, int v, int k) {
  20.         // Base cases
  21.         if (k == 0 && u == v) return 1;
  22.         if (k == 1 && graph[u][v] == 1) return 1;
  23.         if (k <= 0) return 0;
  24.  
  25.         // Initialize result
  26.         int count = 0;
  27.  
  28.         // Go to all adjacents of u and recur
  29.         for (int i = 0; i < V; i++)
  30.             if (graph[u][i] == 1)  // Check if is adjacent of u
  31.                 count += countwalks(graph, i, v, k - 1);
  32.  
  33.         return count;
  34.     }
  35.  
  36.     static final int INF = Integer.MAX_VALUE;
  37.  
  38.     // A naive recursive function to count walks from u to v
  39.     // with k edges
  40.     public static int shortestPath(int graph[][], int u, int v, int k) {
  41.         // Base cases
  42.         if (k == 0 && u == v) return 0;
  43.         if (k == 1 && graph[u][v] != INF) return graph[u][v];
  44.         if (k <= 0) return INF;
  45.  
  46.         // Initialize result
  47.         int res = INF;
  48.  
  49.         // Go to all adjacents of u and recur
  50.         for (int i = 0; i < V; i++) {
  51.             if (graph[u][i] != INF && u != i && v != i) {
  52.                 int rec_res = shortestPath(graph, i, v, k - 1);
  53.                 if (rec_res != INF)
  54.                     res = Math.min(res, graph[u][i] + rec_res);
  55.             }
  56.         }
  57.         return res;
  58.     }
  59.  
  60.     public static void main(String args[]) {
  61.         int graph[][] = new int[][]{
  62.                 {0, 1, 1, 1},
  63.                 {0, 0, 0, 1},
  64.                 {0, 0, 0, 1},
  65.                 {0, 0, 0, 0}
  66.         };
  67.         int u = 0, v = 3, k = 2;
  68.         System.out.println(countwalks(graph, u, v, k));
  69.  
  70.         graph = new int[][]{
  71.                 {0, 10, 3, 2},
  72.                 {INF, 0, INF, 7},
  73.                 {INF, INF, 0, 6},
  74.                 {INF, INF, INF, 0}
  75.         };
  76.         System.out.println("Weight of the shortest path is " +
  77.                 shortestPath(graph, u, v, k));
  78.     }
  79. }
  80.  
  81.  
  82. /**
  83.  * adjList unweighted directed
  84.  */
  85. class SLLNode<E> {
  86.     protected E element;
  87.     protected SLLNode<E> succ;
  88.  
  89.     public SLLNode(E elem, SLLNode<E> succ) {
  90.         this.element = elem;
  91.         this.succ = succ;
  92.     }
  93.  
  94.     @Override
  95.     public String toString() {
  96.         return element.toString();
  97.     }
  98. }
  99.  
  100. interface Queue<E> {
  101.  
  102.     // Elementi na redicata se objekti od proizvolen tip.
  103.  
  104.     // Metodi za pristap:
  105.  
  106.     public boolean isEmpty();
  107.     // Vrakja true ako i samo ako redicata e prazena.
  108.  
  109.     public int size();
  110.     // Ja vrakja dolzinata na redicata.
  111.  
  112.     public E peek();
  113.     // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  114.  
  115.     // Metodi za transformacija:
  116.  
  117.     public void clear();
  118.     // Ja prazni redicata.
  119.  
  120.     public void enqueue(E x);
  121.     // Go dodava x na kraj od redicata.
  122.  
  123.     public E dequeue();
  124.     // Go otstranuva i vrakja pochetniot element na redicata.
  125.  
  126. }
  127.  
  128. class LinkedQueue<E> implements Queue<E> {
  129.  
  130.     // Redicata e pretstavena na sledniot nacin:
  131.     // length go sodrzi brojot na elementi.
  132.     // Elementite se zachuvuvaat vo jazli dod SLL
  133.     // front i rear se linkovi do prviot i posledniot jazel soodvetno.
  134.     SLLNode<E> front, rear;
  135.     int length;
  136.  
  137.     // Konstruktor ...
  138.  
  139.     public LinkedQueue() {
  140.         clear();
  141.     }
  142.  
  143.     public boolean isEmpty() {
  144.         // Vrakja true ako i samo ako redicata e prazena.
  145.         return (length == 0);
  146.     }
  147.  
  148.     public int size() {
  149.         // Ja vrakja dolzinata na redicata.
  150.         return length;
  151.     }
  152.  
  153.     public E peek() {
  154.         // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  155.         if (front == null)
  156.             throw new NoSuchElementException();
  157.         return front.element;
  158.     }
  159.  
  160.     public void clear() {
  161.         // Ja prazni redicata.
  162.         front = rear = null;
  163.         length = 0;
  164.     }
  165.  
  166.     public void enqueue(E x) {
  167.         // Go dodava x na kraj od redicata.
  168.         SLLNode<E> latest = new SLLNode<E>(x, null);
  169.         if (rear != null) {
  170.             rear.succ = latest;
  171.             rear = latest;
  172.         } else
  173.             front = rear = latest;
  174.         length++;
  175.     }
  176.  
  177.     public E dequeue() {
  178.         // Go otstranuva i vrakja pochetniot element na redicata.
  179.         if (front != null) {
  180.             E frontmost = front.element;
  181.             front = front.succ;
  182.             if (front == null) rear = null;
  183.             length--;
  184.             return frontmost;
  185.         } else
  186.             throw new NoSuchElementException();
  187.     }
  188.  
  189. }
  190.  
  191. class GraphNode<E> {
  192.     private int index;//index (reden broj) na temeto vo grafot
  193.     private E info;
  194.     private LinkedList<GraphNode<E>> neighbors;
  195.  
  196.     public GraphNode(int index, E info) {
  197.         this.index = index;
  198.         this.info = info;
  199.         neighbors = new LinkedList<GraphNode<E>>();
  200.     }
  201.  
  202.     boolean containsNeighbor(GraphNode<E> o) {
  203.         return neighbors.contains(o);
  204.     }
  205.  
  206.     void addNeighbor(GraphNode<E> o) {
  207.         neighbors.add(o);
  208.     }
  209.  
  210.     void removeNeighbor(GraphNode<E> o) {
  211.         if (neighbors.contains(o))
  212.             neighbors.remove(o);
  213.     }
  214.  
  215.     @Override
  216.     public String toString() {
  217.         String ret = "INFO:" + info + " SOSEDI:";
  218.         for (int i = 0; i < neighbors.size(); i++)
  219.             ret += neighbors.get(i).info + " ";
  220.         return ret;
  221.  
  222.     }
  223.  
  224.     @Override
  225.     public boolean equals(Object obj) {
  226.         @SuppressWarnings("unchecked")
  227.         GraphNode<E> pom = (GraphNode<E>) obj;
  228.         return (pom.info.equals(this.info));
  229.     }
  230.  
  231.     public int getIndex() {
  232.         return index;
  233.     }
  234.  
  235.     public void setIndex(int index) {
  236.         this.index = index;
  237.     }
  238.  
  239.     public E getInfo() {
  240.         return info;
  241.     }
  242.  
  243.     public void setInfo(E info) {
  244.         this.info = info;
  245.     }
  246.  
  247.     public LinkedList<GraphNode<E>> getNeighbors() {
  248.         return neighbors;
  249.     }
  250.  
  251.     public void setNeighbors(LinkedList<GraphNode<E>> neighbors) {
  252.         this.neighbors = neighbors;
  253.     }
  254.  
  255.  
  256. }
  257.  
  258. class Graph<E> {
  259.  
  260.     int num_nodes;
  261.     GraphNode<E> adjList[];
  262.  
  263.     @SuppressWarnings("unchecked")
  264.     public Graph(int num_nodes, E[] list) {
  265.         this.num_nodes = num_nodes;
  266.         adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
  267.         for (int i = 0; i < num_nodes; i++)
  268.             adjList[i] = new GraphNode<E>(i, list[i]);
  269.     }
  270.  
  271.     @SuppressWarnings("unchecked")
  272.     public Graph(int num_nodes) {
  273.         this.num_nodes = num_nodes;
  274.         adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
  275.     }
  276.  
  277.     int adjacent(int x, int y) {
  278.         // proveruva dali ima vrska od jazelot so
  279.         // indeks x do jazelot so indeks y
  280.         return (adjList[x].containsNeighbor(adjList[y])) ? 1 : 0;
  281.     }
  282.  
  283.     void addEdge(int x, int y) {
  284.         // dodava vrska od jazelot so indeks x do jazelot so indeks y
  285.         if (!adjList[x].containsNeighbor(adjList[y])) {
  286.             adjList[x].addNeighbor(adjList[y]);
  287.         }
  288.     }
  289.  
  290.     void deleteEdge(int x, int y) {
  291.         adjList[x].removeNeighbor(adjList[y]);
  292.     }
  293.  
  294.     void dfsSearch(int node) {
  295.         // visited array filled with false
  296.         boolean visited[] = new boolean[num_nodes];
  297.         for (int i = 0; i < num_nodes; i++)
  298.             visited[i] = false;
  299.  
  300.         dfsRecursive(node, visited);
  301.     }
  302.  
  303.     void dfsRecursive(int node, boolean visited[]) {
  304.         // set currently searched node to true
  305.         visited[node] = true;
  306.         // print it
  307.         System.out.println(node + ": " + adjList[node].getInfo());
  308.  
  309.         // for all of its neighbors
  310.         for (int i = 0; i < adjList[node].getNeighbors().size(); i++) {
  311.             GraphNode<E> pom = adjList[node].getNeighbors().get(i);
  312.             // if you find one that isn't visited, recursively do it for it, the neighbor
  313.             if (!visited[pom.getIndex()])
  314.                 dfsRecursive(pom.getIndex(), visited);
  315.         }
  316.     }
  317.  
  318.     void dfsNonrecursive(int node) {
  319.         // visted[] array
  320.         boolean visited[] = new boolean[num_nodes];
  321.         // visted[] array fill with false
  322.         for (int i = 0; i < num_nodes; i++)
  323.             visited[i] = false;
  324.         // starting node set to visited
  325.         visited[node] = true;
  326.         System.out.println(node + ": " + adjList[node].getInfo());
  327.  
  328.         // start pushed in stack
  329.         Stack<Integer> stack = new Stack<Integer>();
  330.         stack.push(node);
  331.  
  332.         GraphNode<E> topmost;
  333.  
  334.         while (!stack.isEmpty()) {
  335.             // get topmost of stack
  336.             topmost = adjList[stack.peek()];
  337.             GraphNode<E> neighbor = null;
  338.             // loop through all of topmosts neighbors
  339.             for (int i = 0; i < topmost.getNeighbors().size(); i++) {
  340.                 neighbor = topmost.getNeighbors().get(i);
  341.                 // if you find a neighbor which is not visited, the first one
  342.                 if (!visited[neighbor.getIndex()])
  343.                     break;
  344.             }
  345.             if (neighbor != null && !visited[neighbor.getIndex()]) {
  346.                 // mark that unvisited neighbor as visited
  347.                 visited[neighbor.getIndex()] = true;
  348.                 // print it and push it in the stack
  349.                 System.out.println(neighbor.getIndex() + ": " + neighbor.getInfo());
  350.                 stack.push(neighbor.getIndex());
  351.             } else {
  352.                 stack.pop();
  353.             }
  354.         }
  355.  
  356.     }
  357.  
  358.     void bfs(int node) {
  359.  
  360.         // visited array filled with false
  361.         boolean visited[] = new boolean[num_nodes];
  362.         for (int i = 0; i < num_nodes; i++)
  363.             visited[i] = false;
  364.  
  365.         // mark start as true
  366.         visited[node] = true;
  367.         // print it
  368.         System.out.println(node + ": " + adjList[node].getInfo());
  369.  
  370.         // enqueue the start
  371.         Queue<Integer> q = new LinkedQueue<Integer>();
  372.         q.enqueue(node);
  373.  
  374.         GraphNode<E> rearmost;
  375.  
  376.         while (!q.isEmpty()) {
  377.             // dequeue the rear-most
  378.             rearmost = adjList[q.dequeue()];
  379.             GraphNode<E> neighbor = null;
  380.  
  381.             // for all of its neighbors
  382.             for (int i = 0; i < rearmost.getNeighbors().size(); i++) {
  383.                 neighbor = rearmost.getNeighbors().get(i);
  384.  
  385.                 // find the first neighbor that isn't visited
  386.                 if (!visited[neighbor.getIndex()]) {
  387.                     // mark it as visited
  388.                     visited[neighbor.getIndex()] = true;
  389.                     System.out.println(neighbor.getIndex() + ": " + neighbor.getInfo());
  390.                     // enqueue that neighbor
  391.                     q.enqueue(neighbor.getIndex());
  392.                 }
  393.             }
  394.         }
  395.  
  396.     }
  397.  
  398.     @Override
  399.     public String toString() {
  400.         String ret = new String();
  401.         for (int i = 0; i < this.num_nodes; i++)
  402.             ret += i + ": " + adjList[i] + "\n";
  403.         return ret;
  404.     }
  405.  
  406. }
  407.  
  408. class GraphMaze {
  409.  
  410.     int num_nodes; // broj na jazli
  411.     int adjMat[][];  // matrica na sosednost
  412.  
  413.     public GraphMaze(int num_nodes) {
  414.         this.num_nodes = num_nodes;
  415.         adjMat = new int[num_nodes][num_nodes];
  416.  
  417.         for (int i = 0; i < this.num_nodes; i++)
  418.             for (int j = 0; j < this.num_nodes; j++)
  419.                 adjMat[i][j] = 0;
  420.     }
  421.  
  422.     public GraphMaze(int num_nodes, int[][] adjMat) {
  423.         this.num_nodes = num_nodes;
  424.         this.adjMat = adjMat;
  425.     }
  426.  
  427.  
  428.     int adjacent(int x, int y) {  // proveruva dali ima vrska od jazelot so indeks x do jazelot so indeks y
  429.         return (adjMat[x][y] != 0) ? 1 : 0;
  430.     }
  431.  
  432.     void addEdge(int x, int y) {  // dodava vrska megu jazlite so indeksi x i y
  433.         adjMat[x][y] = 1;
  434.         adjMat[y][x] = 1;
  435.     }
  436.  
  437.     void deleteEdge(int x, int y) {
  438.         // ja brise vrskata megu jazlite so indeksi x i y
  439.         adjMat[x][y] = 0;
  440.         adjMat[y][x] = 0;
  441.     }
  442.  
  443.     public int getNum_nodes() {
  444.         return num_nodes;
  445.     }
  446.  
  447.     public void setNum_nodes(int num_nodes) {
  448.         this.num_nodes = num_nodes;
  449.     }
  450.  
  451.  
  452.     @Override
  453.     public String toString() {
  454.         String ret = "  ";
  455.         for (int i = 0; i < num_nodes; i++)
  456.             ret += i + " ";
  457.         ret += "\n";
  458.         for (int i = 0; i < num_nodes; i++) {
  459.             ret += i + " ";
  460.             for (int j = 0; j < num_nodes; j++)
  461.                 ret += adjMat[i][j] + " ";
  462.             ret += "\n";
  463.         }
  464.         return ret;
  465.     }
  466.  
  467.  
  468. }
  469.  
  470.  
  471. class Maze {
  472.  
  473.     //Kje se koristi nenasocen graf implementiran so martica na sosednost
  474.     //za pretstavuvanje na lavirintot
  475.     //Teminjata vo grafot se samo indeksi
  476.     //Iminjata na teminjata se preveduvaat vo broevi preku hash tabela
  477.     //T.e. na pr. 1,1 kje se prevede vo 1 (1,1 kje se zacuva kako string)
  478.  
  479.     GraphMaze g;
  480.     int start_node; //indeks temeto koe e vlez
  481.     int end_node; //indeks na temeto koe e izlez
  482.  
  483.     Hashtable<String, Integer> h;
  484.  
  485.     public Maze() {
  486.         h = new Hashtable<String, Integer>();
  487.     }
  488.  
  489.     void generateGraph(int rows, int columns, String[] in) {
  490.  
  491.         int num_nodes = 0;
  492.  
  493.         String key;
  494.  
  495.         for (int i = 1; i < rows - 1; i++) {
  496.             for (int j = 1; j < columns - 1; j++) {
  497.                 if (in[i].charAt(j) != '#') {
  498.                     key = i + "," + j;
  499.                     h.put(key, num_nodes);
  500.                     if (in[i].charAt(j) == 'S')
  501.                         start_node = num_nodes;
  502.                     if (in[i].charAt(j) == 'E')
  503.                         end_node = num_nodes;
  504.                     num_nodes++;
  505.                 }
  506.             }
  507.         }
  508.  
  509.         g = new GraphMaze(num_nodes);
  510.  
  511.         int x;
  512.         int y;
  513.         //generiranje na matrica na sosednost
  514.         for (int i = 1; i < rows; i++) {
  515.             for (int j = 1; j < columns; j++) {
  516.                 if (in[i].charAt(j) != '#') {
  517.                     //dali ima teme pred nego
  518.                     if (in[i].charAt(j - 1) != '#') {
  519.                         x = h.get(i + "," + j);
  520.                         y = h.get(i + "," + (j - 1));
  521.                         g.addEdge(x, y);
  522.                     }
  523.                     //dali ima teme posle nego
  524.                     if (in[i].charAt(j + 1) != '#') {
  525.                         x = h.get(i + "," + j);
  526.                         y = h.get(i + "," + (j + 1));
  527.                         g.addEdge(x, y);
  528.                     }
  529.                     //dali ima teme nad nego
  530.                     if (in[i - 1].charAt(j) != '#') {
  531.                         x = h.get(i + "," + j);
  532.                         y = h.get((i - 1) + "," + j);
  533.                         g.addEdge(x, y);
  534.                     }
  535.                     //dali ima teme pod nego
  536.                     if (in[i + 1].charAt(j) != '#') {
  537.                         x = h.get(i + "," + j);
  538.                         y = h.get((i + 1) + "," + j);
  539.                         g.addEdge(x, y);
  540.                     }
  541.                 }
  542.             }
  543.         }
  544.     }
  545.  
  546.     // Essentially DFS Non-Recursive for a given adjacency matrix
  547.     void findPath() {
  548.         boolean visited[] = new boolean[g.getNum_nodes()];
  549.         for (int i = 0; i < g.getNum_nodes(); i++)
  550.             visited[i] = false;
  551.         visited[start_node] = true;
  552.         Stack<Integer> s = new Stack<>();
  553.         s.push(start_node);
  554.  
  555.         int pom;
  556.         while (!s.isEmpty() && s.peek() != end_node) {
  557.             pom = s.peek();
  558.             int pom1 = pom;
  559.             for (int i = 0; i < g.getNum_nodes(); i++) {
  560.                 if (g.adjacent(pom, i) == 1) {
  561.                     pom1 = i;
  562.                     if (!visited[i])
  563.                         break;
  564.                 }
  565.             }
  566.             if (!visited[pom1]) {
  567.                 visited[pom1] = true;
  568.                 s.push(pom1);
  569.             } else
  570.                 s.pop();
  571.         }
  572.         if (s.isEmpty())
  573.             System.out.println("Nema reshenie");
  574.         else {
  575.             Stack<Integer> os = new Stack<Integer>();
  576.             while (!s.isEmpty())
  577.                 os.push(s.pop());
  578.             while (!os.isEmpty())
  579.                 System.out.println(os.pop());
  580.         }
  581.     }
  582.  
  583.  
  584.     public static void main(String args[]) {
  585.         Maze m = new Maze();
  586.         int rows = 6;
  587.         int columns = 6;
  588.         String[] in = new String[rows];
  589.  
  590.         in[0] = "######";
  591.         in[1] = "# # ##";
  592.         in[2] = "# # S#";
  593.         in[3] = "# # ##";
  594.         in[4] = "# E  #";
  595.         in[5] = "######";
  596.  
  597.         m.generateGraph(rows, columns, in);
  598.         System.out.println("Pateka:");
  599.         m.findPath();
  600.     }
  601.  
  602. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement