Sunteți pe pagina 1din 6

Algoritmica Grafelor

Sergiu Ioan Ungur, Gr. 231


18 octombrie 2013

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 =

1,dac (i, j)U


0,dac (i , j)U ,i , j X

Lista succesorilor este reprezentat de doi vectori i , unde


i1

i= g+ ( j )+1, aredimensiunea n+1 i n+1 =m+1


j=1

g+ (i)= i+ 1 i , pentru grafe orientate ,


g(i)= i +1 i , pentru grafe orientate ,
i={ ( i ) , ( i)+1,... , ( i+1)1}
Pentru fiecare vrf i X , i indic adresa din tabloul , unde sunt nregistrai
succesorii si, succesorii vrfului i se afl, deci, n tabloul ntre poziiile i i i+11
inclusiv, iar dac i= i+1 , atunci vrful i nu are niciun succesor.

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>

using namespace std;


#define INPUT_LS "ls.in"
#define INPUT_MA "ma.in"
#define MAX_N 1005
int n, m;
vector<int> a, b;
int ma[MAX_N][MAX_N];
void addSuccessor(int x, int y) {
int i, pos;
pos = x < (int)a.size() - 1 ? a[x + 1] : b.size();
b.insert(b.begin() + pos, y);
for (i = x + 1; i < (int)a.size(); ++i) {
++a[i];
}
}
void initLs() {
int i;

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

Date de ieire pentru transformarea list succesori matrice de adiacen:


0
0
0
0

1
0
0
0

1
1
0
0

1
1
0
0

Date de ieire pentru transformarea matrice de adiacen list succesori:


0 3 5 5
2 3 4 3 4

S-ar putea să vă placă și