Documente Academic
Documente Profesional
Documente Cultură
Lab I
Lab I
I. Formularea problemei
Sa se conceapa un algoritm care sa faca conversia de la reprezentarea prin matricea de adiacenta a unui graf la reprezentarea prin lista predecesorilor.
Algoritmul de conversie din matricea de adiacenta in lista predecesorilor presupune efectuarea urmatorilor pasi: a. Citirea matricei de adiacenta a grafului. b. Crearea a 2 tablouri unidimensionale alfa si beta cu semnificatiile urmatoare: alfa vector de pozitii; alfa(i) reprezentand pozitia din beta de pe care incepe aparitia predecesorilor varfului i. beta vector de predecesori.
In primul rand se citeste matricea de adiacenta. De asemenea avem grija ca alfa(1) sa ia valoarea 1. Apoi se parcurge aceasta matrice pe coloane si pentru fiecare valoare nenula intalnita se va adauga indicele liniei pe care se afla acea valoare in vectorul beta. La schimbarea coloanei se va retine in vetorul alfa pozitia ultimului element memorat in beta plus 1.
-1-
In primul rand am luat algoritmul din curs ) iar in al doilea: In elaborarea acestui algoritm folosim observatia ca fiecare valoare nenula din matricea de adiacenta defineste (refera) un arc si acesta defineste o pozitie in vectorul beta. Deci, numarul valorilor nenule din matricea de adiacenta este dimensiunea lui beta. Daca se parcurge matricea pe coloane valorile nenule depistate in ea, definesc predecesorii varfului atasat acelei. Daca se introduc acesti indici de linie succesiv in vectorul beta, acesta va contine multimile 1, 2,, n. La schimbarea coloanei se va retine in vetorul alfa pozitia ultimului element memorat in beta plus 1.
-2-
V. Cod sursa
public class Transform { private static int[][] A; private static int[] alfa; private static int[] beta; private static int nodes; private static void printA() { int i, j; for (i = 1; i <= nodes; i++) { for (j = 1; j <= nodes; j++) { System.out.print(A[i][j] + " "); } System.out.println(); } } private static void printList(int[] list, int length) { for (int i = 1; i <= length; i++) { System.out.print(list[i] + " "); } System.out.println(); } private static void init() throws IOException { Scanner in = new Scanner(System.in); System.out.println("Numarul de varfuri"); nodes = in.nextInt(); A = new int[nodes + 1][nodes + 1]; System.out.println("Introduceti matricea de adiacenta");
-3-
for (int i = 1; i <= nodes; i++) { for (int j = 1; j <= nodes; j++) { A[i][j] = in.nextInt(); } } beta = new int[nodes + 2]; alfa = new int[nodes * (nodes - 1) + 2]; in.close(); } public static void main(String[] arg) { int i, j; try { init(); } catch (IOException e) { System.out.println("Eroare la initializare"); e.printStackTrace(); } int nr = 1; for (j = 1; j <= nodes; j++) { beta[j] = nr; for (i = 1; i <= nodes; i++) if (A[i][j] != 0) { alfa[nr] = i; nr++; } } System.out.println("Matricea de adiacenta"); printA(); System.out.println("Sirul pozitilor predecesorilor"); printList(alfa, nr - 1); System.out.println("Sirul predecesorilor"); printList(beta, nodes); } }
-4-
Date de intrare 01110 00110 00001 00101 00000 010100 101100 010110 101000 001000 000000
Date de iesire a: 1 1 2 5 7 b: 1 1 2 4 1 2 3 4
a: 1 3 5 8 11 12 b: 2 4 1 3 2 4 5 1 2 3 3
-5-