C8

vsetko spolu

package PAZ1b.cvicenie08;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

import sk.upjs.jpaz2.*;

public class Launcher {

        // Vytvori ku neohodnotenemu grafu prisluchajucu maticu susednosti
//      public static boolean[][] grafNaMaticuSusednosti(Graph g) {
//              Vertex[] vrcholyVPoli = g.createVertexArray();
//              boolean[][] matica = g.createAdjacencyMatrix(vrcholyVPoli);
//              return matica;
//      }

        // Otestuje suvislost neorientovaneho grafu zadaneho maticou susednosti
        public static boolean suvislostNeorientovaneho(boolean[][] matica) {
                // Vyberieme pocet vrcholov grafu
                int n = matica.length;

                // Vytvorime pole na evidenciu navstivenia vrcholu (default je false)
                boolean[] navstiveny = new boolean[n];

                // Vytvorime rad pre navstivene vrcholy, ktorych susedov sme zatial
                // neskusali navstivit
                Queue<Integer> rad = new LinkedList<Integer>();

                // Na zaciatku je navstiveny iba startovaci vrchol
                navstiveny[0] = true;
                rad.offer(0);

                // Kym rad nie je prazdny
                while (!rad.isEmpty()) {
                        // Vyberieme prvy vrchol v rade
                        int vIdx = rad.poll();

                        // Postupne vsetkych nenavstivenych susedov vrcholu oznacime ako
                        // navstivenych a pridame ich do radu
                        for (int i = 0; i < n; i++)
                                if ((matica[vIdx][i]) && (!navstiveny[i])) {
                                        navstiveny[i] = true;
                                        rad.offer(i);
                                }
                }

                // Zistime, ci ostal nejaky vrchol nenavstiveny
                for (int i = 0; i < n; i++)
                        if (!navstiveny[i])
                                return false;

                return true;
        }

        public static int[] vzdialenostiOdStartovaciehoVrcholu(boolean[][] matica, int start) {
                // metoda vrati pole kde na i-tom indexe je vzdialenost vrcholu i od
                // startovacieho vrcholu
                // Vyberieme pocet vrcholov grafu
                int n = matica.length;

                int[] vzdialenosti = new int[n];
                Arrays.fill(vzdialenosti, -1);

                // Vytvorime rad pre navstivene vrcholy, ktorych susedov sme zatial
                // neskusali navstivit
                Queue<Integer> rad = new LinkedList<Integer>();

                // Na zaciatku je navstiveny iba startovaci vrchol
                vzdialenosti[start] = 0;
                rad.offer(start);

                // Kym rad nie je prazdny
                while (!rad.isEmpty()) {
                        // Vyberieme prvy vrchol v rade
                        int vIdx = rad.poll();

                        // Postupne vsetkych nenavstivenych susedov vrcholu oznacime ako
                        // navstivenych a pridame ich do radu
                        for (int i = 0; i < n; i++)
                                if ((matica[vIdx][i]) && (vzdialenosti[i] == -1)) {
                                        rad.offer(i);
                                        vzdialenosti[i] = vzdialenosti[vIdx] + 1;
                                }
                }

                return vzdialenosti;
        }

        public static void vypisCestu(boolean[][] matica, int start, int ciel) {
                // metoda vypise cestu zo startovacieho vrcholu do cieloveho vrcholu
        }

        public static void main(String[] args) {
                // vytvorim si maticu susednosti pre graf
                boolean[][] graf = new boolean[5][5];
                graf[0][1] = true;
                graf[1][0] = true;
                graf[1][2] = true;
                graf[2][1] = true;
                graf[2][3] = true;
                graf[3][2] = true;
                graf[3][4] = true;
                graf[4][3] = true;
                graf[2][4] = true;
                graf[4][2] = true;

                // vypisem maticu susednosti pre graf
                for (int i = 0; i < graf.length; i++) {
                        for (int j = 0; j < graf[0].length; j++) {
                                System.out.print(graf[i][j] + "\t");
                        }
                        System.out.println();
                }

                System.out.println(Arrays.toString(vzdialenostiOdStartovaciehoVrcholu(graf, 2)));

        }
}