Advertisement
PopaLepo

Grafuri

Apr 9th, 2017
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.11 KB | None | 0 0
  1. GRAFURI
  2.  
  3. 1) Grafuri Neorientate
  4.  
  5. Se numeste graf neorientat , perechea G=(X,U) , unde X este multime finita si nevida numita multimea varfurior , iar U este
  6. formata din perechi neordonate de elemente din X si poarta denumirea de multimea muchiilor.
  7.  
  8. Numarul de grafuri neorientate care se pot construi cu n varfuri este 2^(Combinari de n luate cate 2)
  9.  
  10. Definim gradul unui varf x ca fiind numarul de muchii incidente in varful x.
  11.  
  12. Se numeste varf izolat , un varf de gradul 0.
  13.  
  14. Se numeste varf terminal , un varf de gradul 1.
  15.  
  16. Intr-un graf neorientat , suma gradelor varfurilor este egala cu 2*m ( nr de muchii )
  17.  
  18. Se numeste graf partial al grafului G , graful G1=(X,U1) cu U1 inclus inŠ‚ U
  19.  
  20. Nr de grafuri partiale a unui graf cu m muchii este 2^m
  21.  
  22. Se numeste subgraf al grafului G , graful G1=(X1,U1) unde X1 inclus inŠ‚ X , iar U1 este formata din acele muchii din U care au ambele
  23. extremitati in multimea X1.
  24.  
  25. Nr de subgrafuri ale unui graf cu n varfuri este 2^n - 1
  26.  
  27. Se numeste graf complet , un graf in care oricare 2 varfuri sunt adiacente ( Gradul oricarui varf este n-1 ) ( nr de muchii este
  28. (n*(n-1)/2)
  29.  
  30. Se numeste graf nul , un graf in care toate varfurile au gradul 0.
  31.  
  32. Se numeste graf regulat , un graf in care toate varfurile au acelasi grad.
  33.  
  34. Metode de reprezentare : 1 ) Lista de muchii :
  35. fiecare muchie va fi memorata intr-un vector v cu elemente de tip struct, struct muchie {int e1,e2;};
  36. 2 ) Matricea de adiacenta :
  37. vom folosi o matrice de adiacenta ( n linii n coloane ) , a[i][j]=1 daca exista muchie de la i la j si 0 altfel.
  38. diagonala principala a matricei de adiacenta are peste tot valoarea 0 , iar matricea este simetrica fata de diagonala principala.
  39. 3 ) Matricea de incidenta :
  40. vom folosi o matrice de incidenta , care va avea n linii si m coloane , B[i][j] = 1 daca muchia j este incidenta in varful i si 0 altfel.
  41. 4 ) Listele de adiacenta :
  42. pentru a memora lista de adiacenta a unui graf , vom folosi o matrice cu n linii , fiecare linie memorand vecinii varfului corespunzator linieie respective
  43.  
  44. LANTURI / CICLURI
  45.  
  46. Se numeste lant in graful G=(X,U) , succesiunea de varfuri L=[x1,x2,..,xk] cu xi apartine lui x si i luand valori de la 1 la k , avand proprietatea ca intre oricare doua varfuri consecutive xi,xi+1 exista muchie.
  47.  
  48. Lungimea lantului este data de numarul de muchii care compun lantul. ( nr de noduri - 1 )
  49.  
  50. Se numeste lant elementar , un lant cu varfurile distincte.
  51.  
  52. Se numeste lant simplu , un lant in care muchiile sunt distincte
  53.  
  54. Se numeste ciclu , un lant simplu in care extremitatea initiala coincide cu extremitatea finala
  55.  
  56. Se numeste ciclu elementar , un ciclu in care varfurile sunt distincte cu exceptia primului si ultimului varf.
  57.  
  58.  
  59. PARCURGEREA GRAFURILOR
  60.  
  61. 1) Parcurgerea in adancime
  62.  
  63. - se viziteaza nodul curent ( se prelucreaza nodul curent ),dupa care se parcurg in adancime toti vecinii nevizitati ai nodului curent
  64.  
  65. void adancime(int p)
  66. { prelucram nodul curent
  67. viz[p]=1;
  68. for(int i=1;i<=n;i++)
  69. if(a[p][i]==1 && viz[i]==0)
  70. adancime(i);}
  71.  
  72. 2) Parcurgerea in latime
  73.  
  74. - se incarca in coada toti vecinii nevizitati ai elementului curent din coada. Algoritmul se incheie,in momentul in care s-a incercat incarcarea in coada a tuturor varfurilor.
  75. - spre deosebire de subprogramul pentru parcurgerea in adancime, unde aveam ca parametru nodul de pornire, in cazul parcurgerii in latime vom avea ca parametru pozitia curenta din vectorul C ( din coada )
  76.  
  77. void latime(int poz)
  78. { prelucram c[poz] // nodul curent
  79. for(int k=1;k<=n;k++)
  80. if(viz[k]==0 && A[c[poz][k]]==1)
  81. { viz[k]=1;
  82. nrc++;
  83. c[nrc]=k; }
  84. if(poz<n)
  85. latime(poz+1);}
  86.  
  87. Apel : cout<<"nodul de pornire : "; cin>>p;
  88. c[1]=p; nrc=1; viz[p]=1; latime(1);
  89.  
  90. GRAFURI BIPARTITE
  91.  
  92. Se numeste graf bipartit , graful G=(X,U) cu proprietatea ca exista o partitie a multimii X in doua submultimi X1,X2, astfel incat orice muchie are o extremitate in multimea X1 si cealalta extremitatea in multimea X2.
  93.  
  94. Vom marca nodurile grafului cu 1 , respectiv -1 , astfel incat 2 noduri adiacente sa aiba marcaje diferite, in cazul in care vom reusi sa avem un astfel de marcaj, vom spune ca graful nostru este bipartit.
  95.  
  96. In cazul in care ajungem sa marcam un nod deja marcat cu o alta valoare, vom spune ca graful nu este bipartit.
  97. Valoarea marcajului fiecarui nod va fi retinuta in vectorul marca[i]
  98.  
  99. void verifica(int p , int vm)
  100. { marca[p]=vm;
  101. viz[p]=1;
  102. vm=(-1)*vm;
  103. for(int k=1;k<=n;k++)
  104. if(a[p][k]==1)
  105. if(viz[k]==0)
  106. verifica(k,vm);
  107. else
  108. if(marca[k]!=vm)
  109. bipartit=0;}
  110.  
  111. Apel:
  112. bipartit=1;
  113. vm=1;
  114. verifica(1,1);
  115.  
  116. CONEXITATE IN GRAFURI. COMPONENTE CONEXE
  117.  
  118. Se numeste graf conex, un graf cu proprietatea ca oricare 2 noduri sunt legate printr-un lant.
  119. Se numeste componenta conexa a unui graf, un subgraf maximal in raport cu proprietatea de conexitate.
  120. Grafurile conexe au o singura componenta conexa.
  121.  
  122. Determinarea componentelor conexe:
  123.  
  124. int nrc=0; // nr de componente conexe
  125. for(int i=1;i<=n;i++)
  126. if(viz[i]==0)
  127. {cout<<"comp conexa";
  128. adancime(i);}
  129. if(nrc==1)
  130. cout<<"graf conex";
  131.  
  132. GRAFURI HAMILTONIENE
  133.  
  134. Se numeste lant hamiltonian , un lant elementar care trece prin toate varfurile grafului.
  135. Se numeste ciclu hamiltonian , un lant hamiltonian in care extremitatea initiala coincide cu extremitatea finala.
  136. Se numeste graf hamiltonian , un graf care contine un ciclu hamiltonian.
  137.  
  138. Daca intr-un graf neorientat G=(X,U) cu card(x)>=3 orice nod Z din X verifica relatia d(z)>=(n/2) atunci G este graf hamiltonian.
  139.  
  140. GRAFURI EULERIENE
  141.  
  142. Se numeste lant eulerian , un lant simplu care trece prin toate muchiile grafului.
  143. Se numeste ciclu eulerian , un lant eulerian in care extremitatea initiala coincide cu extremitatea finala.
  144. Se numeste graf eulerian , un graf care contine un ciclu eulerian.
  145.  
  146. G este eulerian daca si numai daca G este conex si gradele tuturor varfurilor sunt numere pare ( daca graful nu are noduri izolate )
  147.  
  148.  
  149. ARBORI ( ARBORI LIBERI )
  150.  
  151. Se numeste arbore, un graf neorientat conex fara cicluri.
  152. Orice arbore cu n noduri are n-1 muchii.
  153. Prin adaugarea unei singure muchii, obtinem un ciclu iar prin scoaterea unei singure muchii graful nu mai este conex.
  154.  
  155.  
  156. GRAFURI ORIENTATE
  157.  
  158. Se numeste graf orientat, perechea G=(X,U) unde X este multime finita si nevida, numita multimea nodurilor, iar U este formata din perechi ordonate de elemente din X si poarta denumirea de multimea arcelor.
  159.  
  160. In cazul in care intre doua noduri x1,x2 exista arc de la x1 la x2 si de la x2 la x1, vom spune ca avem arc dublu.
  161.  
  162. (x1,x2) - Vom spune ca nodurile x1,x2 sunt adiacente iar arcul (x1,x2) este incident in nodul x2.
  163.  
  164. S(x1) - Multimea succesorilor nodului x1.
  165. U+(x1) - Multimea arcelor care au extemitatea initiala in nodul x1.
  166. P(x1) - Multimea predecesorilor nodului x1.
  167. U-(x1) - Multimea arcelor care au extremitatea finala in nodul x1.
  168.  
  169. Nr grafurilor orientate care se pot construi cu n noduri este 4^(Combinari de n luate cate 2).
  170.  
  171. Graf complet : graf in care oricare doua noduri sunt adiacente. Intr-un graf complet exista intre n(n-1)/2 si n(n-1) arce.
  172. Cu un graf orientat cu n noduri putem forma 3^(Combinari de n luate cate 2) grafuri complete.
  173.  
  174. Definim gradul exterior nodului x1, notat d+(x1) ca fiind nr de succesori ai nodului x1.
  175. Definim gradul interior nodului x1, notat d-(x1) ca fiind nr de predecesori ai nodului x1.
  176.  
  177. Nod izolat <=> d+(x1)=d-(x1)=0 Nod terminal <=> d+(x1)+d-(x1)=1
  178.  
  179. Intr-un graf orientat, suma gradelor interioare este egala cu suma gradelor exterioare si este egala cu nr de arce.
  180.  
  181. Matricea de adiacenta { 1 daca exista arc de la i la j si 0 altfel }
  182.  
  183. d+(xi) = suma elementelor pe linia xi.
  184. d-(xi) = suma elementelor pe coloana xi.
  185.  
  186. Nodul sursa al unui graf apare pe primul loc din pereche de n-1 ori si niciodata pe locul al doilea.
  187. Nodul destinatie al unui graf apare pe al doilea loc din pereche de n-1 ori si niciodata pe primul loc.
  188.  
  189. Matricea de incidenta { 1 daca nodul i este extremitatea initiala pentru arcul j ,-1 daca nodul i este extremitatea finala pentru arcul j, si 0 altfel } ( nr de valori de 1 pe linia i reprezinta gradul exterior al nodului i , iar numarul de valori de -1 gradul interior )
  190.  
  191. Listele de adiacenta.
  192.  
  193. 1) Lisa succesorilor , notata L+, unde L+[i], multimea tuturor nodurilor j , cu prop ca (i,j) apartine U.
  194. 2) Lisa predecesorilor , notata L-, unde L-[i], multimea tuturor nodurilor j , cu prop ca (j,i) apartine U.
  195.  
  196. Vectorul de arce.
  197. - o structura cu doua campuri in care vom retine extremitatea initiala si extremitatea finala ( struct arc{int ei,ef;}; arc v[20]; )
  198.  
  199. Lant.Drum.Circuit.
  200.  
  201. Se numeste lant, succesiunea de noduri x1,x2,..xk cu proprietatea ca oricare ar fi i de la 1 la k-1, nodurile xi si xi+1 sunt adiacente.
  202. Un lant cu arcele distincte poarta denumirea de lant simplu.
  203. Un lant cu nodurile distincte poarta denumirea de lant elementar.
  204.  
  205. Se numeste drum, un lant in care toate arcele au aceeasi orientare.
  206. Se numeste drum elementar, un drum cu nodurile distincte.
  207. Se numeste drum simplu, un drum cu arcele distincte.
  208.  
  209. Se numeste circuit, un drum simplu in care extremitatea initiala coincide cu extremitatea finala.
  210. Se numeste circuit elementar, un circuit cu nodurile distincte cu exceptia primului si ultimului nod.
  211.  
  212. Conexitate in grafuri orientate.
  213.  
  214. void adancipe(int p)
  215. { viz[p]=1;
  216. // prelucram nodul p
  217. for(int i=1;i<=n;i++)
  218. if(viz[i]==0&&(a[p][i]==1||a[i][p]==1))
  219. adancime(i);}
  220.  
  221. for(int i=1;i<=n;i++)
  222. if(viz[i]==0)
  223. { nrc++;
  224. cout<<"comp conexa ";
  225. adancime(p);}
  226.  
  227. Graf turneu
  228.  
  229. Un graf orientat G=(X,U) se numeste graf turneu, daca si numai daca intre oricare doua noduri exista un arc si numai unul.
  230. Orice graf turneu este graf complet. Avem 2^(Combinari de n luate cate 2 ) grafuri turneu. In orice graf turneu exista un drum elementar ce trece prin toate varfurile grafului.
  231.  
  232. Verificarea daca un graf este turneu :
  233.  
  234. int verif()
  235. {
  236. for(int i=1;i<n;i++)
  237. for(int j=i+1;j<=n;j++)
  238. if((a[i][j]==0&&a[j][i]==0)||(a[j][i]==1&&a[i][j]==1)||a[i][i]==1)
  239. return 0;
  240. return 1;}
  241.  
  242.  
  243. Matricea Drumurilor. ( Algoritmul lui Roy Warshall )
  244.  
  245. Definim matricea drumurilor asociata unui graf orientat in modul urmator : D[i][j]=1 daca exista drum de la i la j si 0 altfel.
  246.  
  247. Algoritmul Roy Warshall foloseste matricea de adiacenta, construirea matricei drumurilor facandu-se in modul urmator:
  248.  
  249. 1) Se copie matricea de adiacenta in matricea drumurilor.
  250. 2) Pentru fiecare pereche i,j cu D[i][j]==0 se cauta un nod k astfel incat D[i][k]==1 && D[k][j]==1 cu i!=k si k!=j.
  251.  
  252. void matricea_drumurilor()
  253. { for(int i=1;i<=n;i++)
  254. for(int j=1;j<=n;j++)
  255. d[i][j]=a[i][j];
  256. for(int k=1;k<=n;k++)
  257. for(int i=1;i<=n;i++)
  258. if(i!=k&&d[i][k]==1)
  259. for(int j=1;j<=n;j++)
  260. if(j!=k&&d[k][j]==1)
  261. d[i][j]=1;}
  262.  
  263. Grafuri tare conexe
  264.  
  265. Vom spune ca graful G=(X,U) este tare conex daca si numai daca oricare ar fi x1,x2 din X, exista drum de la x1 la x2 si de la x2 la x1.
  266. Se numeste componenta tare conexa a unui graf orientat, un subgraf maximal in raport cu proprietatea de tare conexitate.
  267. Pentru a verifica daca un graf este tare conex, vom construi matricea drumurilor si vom verifica daca D[i][j]=1 oricare ar fi i!=j.
  268.  
  269. int verif() // daca este tare conex
  270. {
  271. for(int i=1;i<=n;i++)
  272. for(int j=1;j<=n;j++)
  273. if(i!=j&&d[i][j]==0)
  274. return 0;
  275. return 1;
  276. }
  277.  
  278. Determinarea drumurilor de cost minim/maxim ( Algoritmul lui Roy-Floyd )
  279.  
  280. Algoritmul va modifica matricea costurilor astfel incat in urma rularii algoritmului lui Roy-Floyd c[i][j] va contine costul drumului minim/maxim pentru nodurile i si j.
  281.  
  282. void rf()
  283. {
  284. for(int k=1;k<=n;k++)
  285. for(int i=1;i<=n;i++)
  286. if(k!=i&&c[i][k]!=32000)
  287. for(int j=1;j<=n;j++)
  288. if(k!=j&&c[k][j]!=32000)
  289. if(c[i][j]>c[k][j]+c[i][k])
  290. c[i][j]=c[i][k]+c[k][j];
  291. }
  292.  
  293. Afisarea drumului de cost minim de la x la y ( recursiv )
  294.  
  295. void afisdrum(int x,int y)
  296. {
  297. int OK=0;
  298. for(int k=1;k<=n&&!OK;k++)
  299. if(a[x][y]==a[x][k]+a[k][y]&&k!=x&&k!=y)
  300. {
  301. OK=1;
  302. afisdrum(x,k);
  303. afisdrum(k,y);
  304. }
  305. if(OK==0)
  306. cout<<y<<" ";} // iar inainte de apel cout<<x<<" ";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement