Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. /*
  2.  
  3. graful va fi memorat cu listele de adiacenta retinute de o matrice
  4. pentru a identifica componentele biconexe, vom folosi un vector care retine muchiile grafului(indiferent daca fac parte din dfs
  5. sau sunt muchii de intoarcere) in ordinea parcurgerii dfs. Cand identificam un punct de articulatie,
  6. eliminam din vector toate muchiile din componenta biconexa respectiva si le copiem intr o matrice bi ce va retine
  7. toate componentele biconexe
  8.  
  9. Variabila cate retine numarul de componente biconexe, iar varf retine indicele varfului stivi
  10.  
  11.  
  12. Consider pentru simplitate nodul 1 ca fiind de start in dfs
  13.  
  14. */
  15. #include <fstream>
  16. #include<vector>
  17. #include<algorithm>
  18. #define dim 200005
  19. using namespace std;
  20.  
  21. struct muchie
  22. {
  23. int fiu, tata;
  24. };
  25.  
  26. muchie S[dim];
  27. vector<int>a[dim];
  28. vector<vector <int> >bi;
  29. int ord[dim],lowLink[dim],cate,nrOrd,varf;
  30. int n,m;
  31.  
  32. void citire()
  33. {
  34. int i,j,k,x,y;
  35. ifstream fin("biconex.in");
  36. fin>>n>>m;
  37. for(k=1;k<=m;k++)
  38. {
  39. fin>>x>>y;
  40. a[x].push_back(y);
  41. a[y].push_back(x);
  42. }
  43. fin.close();
  44. }
  45.  
  46. void dfs(int nodCurr, int nodTata)
  47. {
  48. //nodCurr este nodul curent, iar nodTata este nodul lui parinte
  49. int i,nod,x,y;
  50. muchie h;
  51. //cand se ajunge aici crestem numarul de ordine din dfs si il atribuim si lui ord si lui lowLink
  52. nrOrd++;
  53. ord[nodCurr]=lowLink[nodCurr]=nrOrd;
  54. //i este variabila de parcurgere a listei unui nod
  55. //nod este nodul adiacent lui nodCurr
  56. //parcurg lista de adiacenta a nodului nodCurr
  57. for(i=0;i<a[nodCurr].size();i++)
  58. {
  59. nod=a[nodCurr][i];
  60. //daca`nodul este chiar parintele nu ne intereseaza
  61. if(nod==nodTata)
  62. continue;
  63. //daca nod nu a mai fost vizitat
  64. if(ord[nod]==-1)
  65. {
  66. //introduc in S muchia (nod,nodCurr)
  67. h.tata=nodCurr;
  68. h.fiu=nod;
  69. varf++;S[varf]=h;
  70. //reapelez functia pentru nod si nodCurr care va deveni nodTata
  71. dfs(nod,nodCurr);
  72. //la derecursivitate
  73. //calculez minimul dintre lowLink de extremitatile muchiei nodCurr, nod
  74. lowLink[nodCurr]=min(lowLink[nodCurr],lowLink[nod]);
  75. //daca nodCurr este punct de articulatie, am gasit o componenta biconexa
  76. //formata din toate muchiile stivei pana la intalnirea muchiei [nodCurr,nod]
  77. if(lowLink[nod]>=ord[nodCurr])
  78. {
  79. cate++;
  80. //copii in matricea bi, componenta conexa din stiva
  81. //vectorul aux retine acea componenta luata din S
  82. vector<int>aux;
  83. do
  84. {
  85. x=S[varf].fiu;
  86. y=S[varf].tata;
  87. varf--;
  88. aux.push_back(x);
  89. aux.push_back(y);
  90. }
  91. while(y!=nodCurr || x!=nod);
  92. bi.push_back(aux);
  93. }
  94. }
  95. else
  96. {
  97. //in acez caz nodCurr a mai fost vizitat, verific daca este o muchie de intoarcere si actualizez lowLink
  98. if(nodCurr!=nodTata)
  99. lowLink[nodCurr]=min(lowLink[nodCurr],ord[nod]);
  100. }
  101.  
  102. }
  103. }
  104.  
  105. int main()
  106. {
  107. ofstream fout("biconex.out");
  108. citire();
  109. int i,j;
  110. for(i=1;i<=n;i++)
  111. ord[i]=lowLink[i]=-1;
  112. //initializez vectorul S cu nodul de pornire, el nu are tata, consider -1
  113. S[0].fiu=1;
  114. S[0].tata=-1;
  115. dfs(1,0);
  116. fout<<cate<<"\n";
  117. //afisez fiecare linie a lui bi
  118. for(i=0;i<bi.size();i++)
  119. {
  120. //in fiecare linie unele noduri apar de mai multe ori si sunt in ordine inversa
  121. //sortez si elimim duplicatele
  122. sort(bi[i].begin(), bi[i].end());
  123. bi[i].erase(unique(bi[i].begin(), bi[i].end()), bi[i].end());
  124. for(j=0;j<bi[i].size();j++)
  125. fout<<bi[i][j]<<" ";
  126. fout<<"\n";
  127. }
  128. return 0;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement