Вы находитесь на странице: 1из 15

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Catedra de Matematic Superioar





Raport
la matematica discret
Tema: Pstrarea grafului n memoria calculatorului






A efectuat:
st. gr.MN -131 Lupanciuc L.
A verificat:
Dr. conf. univ. Marusic G.




Chiinu 2014


Lucrare de laborator
1. Tema: Pstrarea grafului n memoria calculatorului
2.SCOPUL LUCRRII:
Studierea metodelor de definire a unui graf: matrice de inciden, matrice de adiacen, liste;
Elaborarea unor proceduri de introducere, extragere i transformare a diferitor forme de reprezentare intern a
grafurilor cu scoaterea rezultatelor la display i imprimant.

3. Exemplu:
F(x
1
) = { x
3
}, F(x
2
) = {x
6
}, F(x
3
) = {x
2
, x
6
}, F(x
4
) = {x
3
, x
5
}, F(x
5
) = {x
3
} ,F(x
6
) =






4. NOTE DE CURS
Metode de reprezentare a grafului
Exist trei metode de baz de definire a unui graf:
1. Matricea de inciden;
2. Matricea de adiacen;
3. Lista de adiacen (inciden).
Vom face cunotin cu fiecare dintre aceste metode.
Matricea de inciden
Este o matrice de tipul mxn, n care m este numrul de muchii sau arce (pentru un graf orientat), iar n este
numrul vrfurilor. La intersecia liniei i cu coloana j se vor considera valori de 0 sau 1 n conformitate cu
urmtoarea regul:
1 - dac muchia i este incident cu vrful j (dac arcul i "intr" n vrful j n cazul unui graf orientat);
0 - dac muchia (arcul) i i vrful j nu sunt incidente;
-1 - numai pentru grafuri orientate, dac arcul i "iese" din vrful j.







































X
1
X
4
X
2
X
5
X
3
X
6

x
1


x
2


x
3


x
4


x
5


X
6

u
1
-1 0 1 0 0 0
u
2
0 1 -1 0 0 0
u
3
0 -1 0 1 0 0
u
4
0 0 1 -1 0 0
u
5
0 0 0 -1 1 0
u
6
0

0

1

0 -1

0


Fig. 3. Exemplu de matrice din exemplu de mai sus. (v.fig.1)
Este uor de observat c aceast metod este de o eficacitate mic n sensul utilizrii memoriei
calculatorului: fiecare linie conine doar dou elemente diferite de zero (o muchie poate fi incident cu nu
mai mult de dou vrfuri).
Matricea de adiacen
Este o matrice ptrat nxn, aici n este numrul de vrfuri. Fiecare element poate fi 0, dac vrfurile
respective nu sunt adiacente, sau 1, n caz contrar. Pentru un graf fr bucle putem observa urmtoarele:
diagonala principal este format numai din zerouri;
pentru grafuri neorientate matricea este simetric fa de diagonala principal.
x
1
x
2
x
3
x
4
x
5
x
6

x
1
0 0 1 0 0 0
x
2
0 0 0 1 0 0
x
3
0 1 0 0 0 0
x
4
0 0 1 0 1 0
x
5
0 0 1 0 0 0
x
6
0 0 0 0 0 0
Fig. 4. Exemplu de matrice de adiacen din exemplu de mai sus.(v.fig.1)
Dup cum este lesne de observat i n acest caz memoria calculatorului este utilizat nu prea eficace din
care cauz matricea de adiacen ca i matricea de inciden se vor utiliza de obicei doar n cazul n care se
va rezolva o problem concret pentru care reprezentarea grafului n aceast form aduce unele faciliti
algoritmului respectiv.
Pentru pstrarea grafurilor n memoria calculatorului (n deosebi, memoria extern) se va utiliza una din
posibilitile de mai jos.



Lista de adiacen i lista de inciden
Lista de adiacen este o list cu n linii (dup numrul de vrfuri n), n linia cu numrul i vor fi scrise
numerele vrfurilor adiacente cu vrful i.
Lista de inciden se definete analogic cu deosebirea c n linia i vor fi scrise numerele muchiilor (arcelor)
incidente cu vrful i.
Reprezentarea grafurilor prin intermediul acestor liste permite utilizarea mai eficace a memoriei
calculatorului, ns aceste forme sunt mai complicate att n realizare, ct i n timpul procesrii.
Pentru a lua n consideraie lungimea variabil a liniilor vor fi utilizate variabile dinamice i
pointeri.Vom exemplifica pentru un graf cu n vrfuri. Deoarece fiecare element al listei conine
numere de vrfuri este evident s considerm c vom avea un ir de variabile dinamice de tip
INTEGER care se vor afla n relaia respectiv de precedare (succedare). Aceast relaie se va
realiza prin pointeri, unii mpreun cu variabila de tip ntreg n nregistrarea (Pascal: record).
Pentru a pstra indicatorii de intrare n aceste iruri se va folosi un tablou unidimensional de
indicatori de lungime n. n calitate de simbol de terminare a irului se va utiliza un simbol care nu a
fost folosit la numeraia vrfurilor (de exemplu 0), care va fi introdus n calitate de variabil de tip
ntreg al ultimului bloc.
De exemplu, lista de adiacen (fig.1.1):
1 - 3, 0
2 4, 0
3 - 2, 0
4 3, 5,0
5 3,0
6 - 0

5.Programul in C:
1. #include <conio.h>
2. #include <stdio.h>
3. #include <stdlib.h>
4. #define L 100

5. int matr_incid[L][L],n,m;
6. int matr_adiac[L][L];
7. int list_adiac[L][L];

8. void meniu_principal();
9. void meniu_introducere();
10. void meniu_afisare();
11. void meniu_modificare();

12. void introducerea_matr_incid();
13. void transfer_matri_matra();
14. void transfer_matra_lista();
15. void introducerea_matr_adiac();
16. void transfer_matra_matri();
17. void introducerea_list_adiac();
18. void transfer_lista_matra();

19. void afisarea_matr_incid();
20. void afisarea_matr_adiac();
21. void afisarea_list_adiac();

22. void adaugarea_virf();
23. void stergerea_virf();
24. void adaugarea_arc();
25. void stergerea_arc();

26. int main()
27. {
28. system("cls");
29. meniu_principal();
30. return 0;
31. }
32. void meniu_principal()
33. { FILE *fp;
34. char optiunea,ch;


35. fp=fopen("meniu_principal.txt","r");
36. system("cls");
37. while ((ch=fgetc(fp))!=EOF)
38. printf ("%c",ch);



39. optiunea=getch();
40. switch(optiunea)
41. {
42. case'1':meniu_introducere();break;
43. case'2':meniu_afisare();break;
44. case'3':meniu_modificare();break;
45. case'0':exit(0);break;
46. default:printf("\n\n Ati ales o optiune gresita!!!Apasati orice tasta pentru a alege alta..");getch();
47. }

48. }
49. void meniu_introducere()
50. {FILE *fp;
51. char optiunea,ch;

52. fp=fopen("meniu_introducere.txt","r");
53. system("cls");
54. while ((ch=fgetc(fp))!=EOF)
55. printf ("%c",ch);


56. optiunea=getch();
57. switch(optiunea)
58. {
a. case'1':introducerea_matr_incid();break;
b. case'2':introducerea_matr_adiac();break;
c. case'3':introducerea_list_adiac();break;
d. case'4':meniu_principal();break;
e. case'0':exit(0);break;
f. default:printf("\n\nAti ales o optiune gresita!!! Apasati orice tasta pentru a alege alta");getch();


59. }}

60. void meniu_afisare()
61. {
62. char optiunea;
63. do{
64. system("cls");
65. printf("\n\n\n\n"
66. "\n IN CE FORMA DRITI SA AFISEZE GRAFUL"
67. "\n\n 1.Matricea de incidenta"
68. "\n\n 2.Matricea de adiacenta"
69. "\n\n 3.Lista de adiacenta"
70. "\n\n "
71. "\n\n 4.Modificarea grafului"
72. "\n\n 5.Meniul principal"
73. "\n\n "
74. "\n\n 0.Iesire "
75. "\n\n Alegeti optiunea");
76. optiunea=getch();
77. switch(optiunea)
78. {
79. case'1':afisarea_matr_incid();break;
80. case'2':afisarea_matr_adiac();break;
81. case'3':afisarea_list_adiac();break;
82. case'4':meniu_modificare();break;
83. case'5':meniu_principal();break;
84. case'0':exit(0);break;
85. default:printf("\n\nAti ales optiune gresita!!!Apasati orice tasta pentru a alege alta");getch();
86. }
87. }while(1);
88. }
89. void meniu_modificare()
90. {
91. char optiunea;
92. do{
93. system("cls");
94. printf("\n\n\n\n"
95. "\n CE MODIFICARI DORITI SA EFECTUATI"
96. "\n\n 1.Adaugarea unui virf"
97. "\n\n 2.Stergerea unui virf"
98. "\n\n 3.Adaugarea unui arc"
99. "\n\n 4.Stergerea unui arc"
100. "\n\n "
101. "\n\n 5.Meniu principal"
102. "\n\n "
103. "\n\n 0.iesire "
104. "\n\n Alegeti optiunea:");
105. optiunea=getch();
106. switch(optiunea)
107. {
a. case'1':adaugarea_virf();break;
b. case'2':stergerea_virf();break;
c. case'3':adaugarea_arc();break;
d. case'4':stergerea_arc();break;
e. case'5':meniu_principal();break;
f. case'0':exit(0);break;
g. default:printf("\n\nAti ales o optiune gresita!!!Apasati orice tasta pentru a alege alta optiune");

108. }
109. }while(1);
110. }

111. /***********Introducerea grafului************/
112. void introducerea_matr_incid()
113. {
114. system("cls");
115. int i,j,p;

116. printf("\nDati nr de virfuri=");
117. scanf("%d",&n);
118. printf("\nDati nr de arce=");
119. scanf("%d",&m);
120. for(i=1;i<=n;i++)
121. for(j=1;j<=m;j++)
122. matr_incid[i][j]=0;
123. printf("\n\n\t\tIntroduceti Matricea de Incidenta\n\n");
124. for(i=1;i<=m;i++)
125. {
126. system("cls");
127. printf("Avem %d virfuri si %d arce \n\n\n",n,m);
128. printf("\t\tDati coordonatele arcului %d:",i);
129. printf("\n\nDati virful din care iese arcul:");
130. scanf("%d",&j);
131. printf("\n\nDati virful in care pleaca arcul:");
132. scanf("%d",&p);
133. if(j==p)
134. matr_incid[i][j]=2;
135. else
136. {
137. matr_incid[i][j]=-1;
138. matr_incid[i][p]=1;
139. }
140. }
141. transfer_matri_matra();
142. transfer_matra_lista();
143. printf("\n\nApasati orice tasta pentru a continua");
144. getch();
145. meniu_afisare();
146. }

147. void transfer_matri_matra()
148. {
149. int i,j,i1,j1;
150. for(i=1;i<=n;i++)
151. for(j=1;j<=n;j++)
152. matr_adiac[i][j]=0;
153. for(i=1;i<=m;i++)
154. {

155. for(j=1;j<=n;j++)
a. {
b. if(matr_incid[i][j]==-1)
c. i1=j;
d. if(matr_incid[i][j]>0)
e. j1=j;}

156. if(i1>0)
157. matr_adiac[i1][j1]=1;
158. else matr_adiac[i1][j1]=1;
159. }
160. }
161. void transfer_matra_lista()
162. {
163. int i,j,p;

164. for (i=1;i<=n;i++)
165. for(j=1;j<=n;j++)
166. list_adiac[i][j]=0;
167. for(i=1;i<=n;i++)
168. {
169. p=1;
170. for(j=1;j<=n;j++)
171. if(matr_adiac[i][j]==1)
172. list_adiac[i][p++]=j;
173. }
174. }
175. void introducerea_matr_adiac()
176. {
177. system("cls");
178. int i,j,k,p;
179. printf("\nDati nr de virfuri=");
180. scanf("%d",&n);
181. for(i=1;i<=n;i++)
182. for(j=1;j<=n;j++)
183. matr_adiac[i][j]=0;
184. for(i=1;i<=n;i++)
185. {
186. system("cls");
187. printf("Avem %d virfuri \n\n\n",n);
188. printf("\n\n\tIntroduceti Matricea de adiacenta:");
189. printf("Cite arce pleaca din %d virf:",i);
190. scanf("%d",&j);

191. for (k=1;k<=j;k++)
192. {
a. printf("\n Dati virful din care pleaca arcul:");
b. scanf("%d",&p);
c. matr_adiac[i][p]=1;
193. }

194. }
195. transfer_matra_lista();
196. transfer_matra_matri();
197. printf("\n\nApasati orice tasta pentru a continua");
198. getch();

199. meniu_afisare();
200. }

201. void transfer_matra_matri()
202. {
203. int i,j,k=1;
204. for(i=0;i<=m;i++)
205. for(j=0;j<=n;j++)
206. matr_incid[i][j]=0;
207. for(i=1;i<=n;i++)
208. for(j=1;j<=n;j++)
209. if(matr_adiac[i][j]!=0)
210. if(i==j)
211. matr_incid[k++][i]=2;
212. else
213. {
214. matr_incid[k][i]=-1;
215. matr_incid[k++][j]=1;
216. }
217. m=k-1;
218. }
219. void introducerea_list_adiac()
220. {
221. system("cls");
222. int i,j,k;
223. printf("\nDati nr de virfuri=");
224. scanf("%d",&n);
225. for(i=1;i<=n;i++)
226. for(j=1;j<=n;j++)
227. list_adiac[i][j]=0;

228. j=1;
229. for(i=1;i<=n;i++)
230. {
231. system("cls");
232. printf("Avem %d virfuri",n);
233. printf("\n\n\t\t Introduceti lista de adiacenta:\n\n");
234. j=1;
235. k=1;
236. while(k!=0)
237. {
a. printf("\nIntroduceti %d element a liniei %d:",j,i);
b. scanf("%d",&k);
c. list_adiac[i][j++]=k;
238. }
239. }
240. transfer_lista_matra();
241. transfer_matra_matri();
242. printf("\n\nApasati orice tasta pentru a continua...");
243. getch();
244. meniu_afisare();
245. }
246. void transfer_lista_matra()
247. {
248. int i,j;
249. for(i=1;i<=n;i++)
250. for(j=1;j<=n;j++)
251. matr_adiac[i][j]=0;
252. for(i=1;i<=n;i++)
253. for(j=1;j<=n;j++)
254. if(list_adiac[i][j]!=0)
255. matr_adiac[i][list_adiac[i][j]]=1;
256. }

257. /** **********Afisarea Grafului ************ 88 */
258. void afisarea_matr_incid()
259. {
260. system("cls");
261. int i,j;
262. printf("\n\t\tMatricea de incidenta: \n\n\n");
263. printf(" ");
264. for(i=1;i<=n;i++)
265. printf("x%-2d",i);
266. for(i=1;i<=m;i++)
267. {
a. printf("\nu%-3d|",i);
b. for(j=1;j<=n;j++)
c. printf("%-3d",matr_incid[i][j]);}
d. getch();
e. meniu_afisare();

268. }

269. void afisarea_matr_adiac()
270. {
271. system("cls");
272. int i,j;
273. printf("\n\t\tmatricea de adiacenta:\n\n\n");
274. printf(" ");
275. for(i=1;i<=n;i++)
276. printf("x%-2d",i);
277. for(i=1;i<=n;i++)
278. {
279. printf("\nx%-3d",i);
280. for(j=1;j<=n;j++)
281. printf("%-3d",matr_adiac[i][j]);

282. }
283. getch();
284. meniu_afisare();
285. }
286. void afisarea_list_adiac()
287. {
288. system("cls");

289. int i,j;
290. printf("\n\t\t Lista de adiacenta:\n\n\n");
291. for(i=1;i<=n;i++)
292. {
293. printf("\n%2d|",i);
294. for(j=1;j<=n;j++)
a. if(list_adiac[i][j]==0)
b. {
c. printf("%2d",list_adiac[i][j]);
d. break;
e. }
f. else printf("%2d",list_adiac[i][j]);
295. }
296. getch();
297. meniu_afisare();
298. }

299. /* ********Modificarea grafului******** */
300. void adaugarea_virf()
301. {
302. system("cls");
303. int i,j,k,i1,j1;
304. n++;
305. printf("\n Cite arce doriti sa adaugati pentru noul virf:");
306. scanf("%d",&k);
307. m=m+k;
308. for(i=1;i<=n;i++)
309. {
310. matr_adiac[i][n]=0;
311. matr_adiac[n][i]=0;
312. }
313. for(i=1;i<=k;i++)
314. {
315. printf("\n Din care virf iese arcul:");
316. scanf("%d",&i1);
317. printf("\n\nIn care virf pleaca arcul:");
318. scanf("%d",&j1);
319. matr_adiac[i1][j1]=1;}

320. transfer_matra_lista();
321. transfer_matra_matri();
322. printf("\n\nApasati orice tasta pentru a continua");
323. getch();
324. meniu_modificare();
325. }

326. void stergerea_virf()
327. {
328. system("cls");
329. int i,j,k;
330. printf("\nCare virf doriti sa stergeti:");
331. scanf("%d",&k);
332. for(i=k+1;i<=n;i++)
333. for(j=1;j<=n;j++)
334. matr_adiac[i-1][j]=matr_adiac[i][j];
335. for(i=k+1;i<=n;i++)
336. for(j=1;j<=n;j++)
337. matr_adiac[j][i-1]=matr_adiac[j][i];
338. n--;

339. transfer_matra_lista();
340. transfer_matra_matri();
341. printf("\n\nApasati orice tasta pentru a continua");
342. getch();
343. meniu_modificare();
344. }

345. void adaugarea_arc()
346. {
347. system("cls");
348. int i1,j1;
349. printf("\t\tAdaugarea arcelor\n\n\n\n");
350. printf("\nDin care virf iese arcul:");
351. scanf("%d",&i1);
352. printf ("\nIn care virf intra arcul:");
353. scanf("%d",&j1);
354. matr_adiac[i1][j1]=1;

355. transfer_matra_lista();
356. transfer_matra_matri();
357. printf("\n\nApasati orice tasta pentru a continua");
358. getch();
359. meniu_modificare();
360. }
361. void stergerea_arc()
362. {
363. system("cls");
364. int i1,j1;
365. printf("\t\tStergerea arcelor\n\n\n\n");
366. printf("\n Din care virf iese arcul:");
367. scanf("%d",&i1);
368. printf("\n\nIn care virf pleaca arcul");
369. scanf("%d",&j1);
370. matr_adiac[i1][j1]=0;
371. transfer_matra_lista();
372. transfer_matra_matri();
373. printf("\n\nApasati orice tasta pentru a continua");
374. getch();
375. meniu_modificare();
376. }










Rezultatul:









Concluzie:In aceasta lucrare de laborator am elaborat un program in limbajul de programe C.In care am eloborat
algoritmi in care graful sa poata fi posibil de transformat in matrice de incidenta,adiacenta si lista.Ce mai eficace
metoda de utilizare a memoriei calculatorului este lista insa este mai dificil in realizare.Celalte doua metoda se pot
realiza cu ajutorul matricilor,fiecare linie conine doar dou elemente diferite de zero (o muchie poate fi
incident cu nu mai mult de dou vrfuri)..Deasemenea programul este capabil sa mai adauge un arc,virf sau
chiar si procesul invers de a sterge un arc sau virf.Acem program poate fi realizat in oricisice alt limbaj.Imaginile care
le-am adaugat demostreaza starea de functionalitate a programului

Вам также может понравиться