Advertisement
StefanPopescu

Untitled

Mar 19th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.44 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