Advertisement
Guest User

havel hakimi

a guest
May 24th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.34 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<fstream>
  4. #include<list>
  5. #include<algorithm>
  6. using namespace std;
  7.  
  8. /*
  9. Idee - la un pas unim varful de grad maxim cu urmatoarele in ordine descrescatoare a gradelor
  10.  
  11. Pentru a reordona secventa la fiecare pas -este suficient sa inversam vectsorul de grade intre pozitiile intre care s-a stricat ordinea
  12. Spre exemplu, pentru secventa
  13. 5 4 4 3 3 3 3 3 2 1 1, dupa un pas, obtinem secventa
  14. 0 3 3 2 2 2 3 3 2 1 1- reordonam intre pozitiile 4 si 8 <=> inversam/oglindim aceasta parte din vector
  15.  
  16. */
  17. struct varf{
  18. int grad;
  19. int eticheta;
  20. };
  21.  
  22. int comp(struct varf v1, struct varf v2){
  23. return v1.grad>v2.grad;
  24. }
  25.  
  26. void afisare(int i,int n, varf* s){
  27. for(int j=i;j<=n;j++)
  28. cout<<s[j].grad<<"/"<<s[j].eticheta<<" ";
  29. cout<<endl;
  30. }
  31.  
  32. int main()
  33. {
  34. varf *s;// secventa citita
  35. vector<pair<int,int> >E;// lista de muchii
  36. int n, x,y,poz1,poz2, i,j,v,poz;
  37.  
  38. ifstream fin("date.in");
  39. fin>>n;
  40. int sum=0;
  41. s=new varf[n+1];
  42. for(i=1;i<=n;i++){// citim secventa si asociem etichete
  43. fin>>x;
  44. varf v={x,i}; //pereche grad,eticheta
  45. s[i]=v;
  46. sum=sum+x;
  47. }
  48. fin.close();
  49.  
  50. if(sum%2==1)
  51. {cout<<"Secventa nu este grafica"; return 0;}
  52.  
  53. sort(s+1,s+n+1,comp);//sortarea initiala a vectorului de perechi
  54. if(s[1].grad>=n)
  55. {cout<<"Secventa nu este grafica"; return 0;}
  56.  
  57. i=1;
  58. while(s[i].grad>0)//cat timp cel mai mare grad e mai mare ca 0, inseamna ca nu am secventa nula, deci tb sa continui
  59. {
  60. afisare(i,n,s);
  61. varf v=s[i]; //v - va fi nodul curent ce trebuie saturat
  62.  
  63. for(j=1;j<=v.grad;j++) //parcurg cele mai mari v.grad noduri = urmatoarele v.grad noduri din secventa
  64. {
  65. s[i+j].grad--; // le decrementez gradul
  66. if(s[i+j].grad<0) {cout<<"Secventa nu este grafica"; return 0;}//verific daca se genereaza ceva negativ - conditie de orprire
  67. E.push_back(make_pair( v.eticheta,s[i+j].eticheta));//adaug muchie de la varful corespunzator lui v la cel corespunzator lui s[i+j] la lista de muchii
  68. }
  69.  
  70. int k=i+v.grad;//ultimul varf caruia i-am scazut gradul
  71.  
  72.  
  73. if(k+1<=n && s[k].grad<s[k+1].grad) //secventa nu ramane sortata <=>s[k].grad =s[k+1].grad-1
  74. {
  75. /*in acest caz exista o subsecventa care trebuie inversata pentru a reordona vectorul,
  76. avand la inceput elementele egale cu s[k].grad si urmata de elemente egale cu s[k+1].grad
  77.  
  78. determinam pozitiile poz1 si poz2 de inceput si sfarsit ale acestei secvente
  79. */
  80.  
  81. int poz1=k-1; //mergem la stanga cat timp gradele sunt egale cu s[k].grad
  82. while(poz1>=1 && s[k].grad==s[poz1].grad)
  83. poz1--;
  84. poz1++;
  85.  
  86. int poz2=k+2; //mergem la dreapta cat timp gradele sunt egale cu s[k+1].grad
  87. while(poz2<=n && s[k+1].grad==s[poz2].grad)
  88. poz2++;
  89.  
  90.  
  91.  
  92. reverse( s+poz1,s+poz2);
  93.  
  94. }
  95. // afisare(i,n,s);
  96. s[i].grad=0;
  97. i++;
  98. }
  99. afisare(i,n,s);
  100. cout<<"Secventa este grafica!\n Muchiile sunt:\n";
  101. for(int i=0;i<E.size();i++) {//afisare cu fr
  102. pair<int,int> p=E[i];
  103. cout<<p.first<<'-'<<p.second<<endl;
  104. }
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement