Documente Academic
Documente Profesional
Documente Cultură
Conversia Unui Graf Din Lista Succesorilor În Matricea de Adiacență
Conversia Unui Graf Din Lista Succesorilor În Matricea de Adiacență
Laborator 1
Enunul problemei
Se cere conversia reprezentrii unui graf din lista succesorilor definit de vectorii
unidimensionali i n matricea de adiacen A.
Dezvoltarea algoritmului
Fie G = (X, U) graf, unde X este mulimea vrfurilor i n = | X |, U este mulimea arcelor, m
= | U |. X = {1...n}, U = {1...m}.
Matricea de adiacen A este o matrice ptratic de ordin n, unde linia i i coloana j
corespund vrfurilor grafului, iar elementele sale se definesc astfel:
mi , j =
Descrierea algoritmului
Algoritmul de transformare a grafului din lista succesorilor n matricea de adiacen:
Se iniializeaz cu 0 matricea de adiacen A de dimensiuni nn , unde n reprezint
numrul de vrfuri. Pentru fiecare vrf i se parcurg succesorii { ( i ), ( i +1) , ... , ( i+11)} i
se adaug 1 n matricea de adiacen pe poziia corespunztoare arcului format ntre cele dou
vrfuri A i , ( j)=1, j{( i ), ( i +1), ... , ( i+1 1)} .
Algoritmul de transformare a grafului din matricea de adiacen n lista succesorilor:
Se iniializeaz cu 0 tabloul . Tabloul este vid. Se parcurge matricea de adiacen A de
nn , unde n reprezint numrul de vrfuri. n momentul n care
dimensiuni
1
A i , j=1, i, j{1. .. n} , se mut cu o poziie spre dreapta elementele din tabloul , ncepnd de pe
poziia (i+ 1) , inclusiv, se adaug n tabloul pe poziia (i+ 1) elementul j, se
incrementeaz valorile elementelor (i+ 1)... a(n) , apoi (i+ 1) ia valoarea (i+ 1)+1 .
Pseudocod:
subalgoritm addSuccessor(x, y)
pos x < lungime(a) - 1 ? a[x + 1] : lungime(b)
insereaza(b, pos, y)
pentru i = x + 1, lungime(a)
a[i] a[i] + 1
subalgoritm initLs()
redimensioneaza(a, n + 1)
pentru i = 1, n
a[i] 0
subalgoritm initMa()
pentru i = 1, n
pentru j = 1, n
ma[i,j] 0
subalgoritm readLs()
citeste(@n)
citeste(@m)
initLs()
cat timp m > 0
citeste(@x)
citeste(@y)
addSuccessor(x, y)
m m - 1
subalgoritm readMa()
citeste(@n)
citeste(@m)
initMa()
cat timp m > 0
citeste(x)
citeste(y)
ma[x,y] 1
m m - 1
subalgoritm transLsInMa()
initMa()
pentru i = 1, lungime(a)
start a[i]
end i < lungime(a) - 1 ? a[i + 1] : lungime(a)
pentru j start, end
ma[i,b[j]] 1
subalgoritm transMaInLs()
initLs()
pentru i = 1, n
pentru j = 1, n
daca ma[i,j] = 1
addSuccessor(i, j)
subalgoritm printLs()
pentru i = 1, lungime(a)
afiseaza(a[i])
afiseaza(ENDLINE)
pentru i = 0, lungime(b)
afiseaza(b[i])
subalgoritm printMa()
pentru i = 1, n
pentru j = 1, n
afiseaza(ma[i,j])
afiseaza(ENDLINE)
functie main()
readLs()
transLsInMa()
printMa()
readMa()
transMaInLs()
printLs()
main 0
Demonstrarea algoritmului
De fcut...
Codul surs
#include
#include
#include
#include
<algorithm>
<fstream>
<iostream>
<vector>
a.resize(n + 1);
for (i = 1; i <= n; ++i) {
a[i] = 0;
}
}
void initMa() {
int i, j;
for (i = 1; i <= n; ++i) {
for (j = 1; j <= n; ++j) {
ma[i][j] = 0;
}
}
}
void readLs() {
int x, y;
ifstream fin(INPUT_LS);
fin >> n;
fin >> m;
initLs();
while (m--) {
fin >> x;
fin >> y;
addSuccessor(x, y);
}
fin.close();
void readMa() {
int x, y;
ifstream fin(INPUT_MA);
fin >> n;
fin >> m;
initMa();
while (m--) {
fin >> x;
fin >> y;
ma[x][y] = 1;
}
fin.close();
}
void transLsInMa() {
int i, j, start, end;
initMa();
for (i = 1; i < (int)a.size(); ++i) {
start = a[i];
end = i < (int)a.size() - 1 ? a[i + 1] : a.size();
for (j = start; j < end; ++j) {
ma[i][b[j]] = 1;
}
}
void transMaInLs() {
int i, j;
initLs();
for (i = 1; i <= n; ++i) {
for (j = 1; j <= n; ++j) {
if (ma[i][j] == 1) {
addSuccessor(i, j);
}
}
}
}
void printLs() {
int i;
for (i = 1; i < (int)a.size(); ++i) {
cout << a[i] << " ";
}
cout << "\n";
for (i = 0; i < (int)b.size(); ++i) {
cout << b[i] << " ";
}
}
void printMa() {
int i, j;
for (i = 1; i <= n; ++i) {
for (j = 1; j <= n; ++j) {
cout << ma[i][j] << " ";
}
cout << "\n";
}
int main() {
// Lista succesori in matrice de adiacenta
//readLs();
//transLsInMa();
//printMa();
// Matrice de adiacenta in lista succesori
readMa();
transMaInLs();
printLs();
return 0;
Datele de test
Date de intrare:
4
2
1
1
2
5
3
2
4
4
1 3
1
0
0
0
1
1
0
0
1
1
0
0