Cod sursa(job #637735)

Utilizator lichMarin Cristian lich Data 20 noiembrie 2011 16:09:39
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.82 kb
#include<fstream>
#include <iostream>
using namespace std;
int nr[11];
int ch[11],x[11][2];
int n,m=0;
void sort(void)  // este o functie care
{                 //sorteaza vectoru nr 
   int x=1,y,i;  //si vectoru ch in functie
   long int z;       //de vectoru nr
   while(x)
   {
      x=0;
      for(i=1;i<=n-1;i++)
         if(nr[i]>nr[i+1])
         {
            y=nr[i];
            nr[i]=nr[i+1];
            nr[i+1]=y;
            z=ch[i];
            ch[i]=ch[i+1];
            ch[i+1]=z;
            x=1;
         }
   }
}
int find1(int c)              //este o functie care 
{                             //returneaza corespondentu
   int i;                    //variabilei c in vectorul nr
   for(i=1;i<=n;i++)
      if(c==ch[i])
         return nr[i];
      return 0;
}
int find(int c)            //este o functie care
{                           //returneaza pozitia
   int i;                  //variabilei c 
   for(i=1;i<=n;i++)       //in vectorul ch
      if(c==ch[i])
         return i;
}
int find2(int c)           //pentru cazul in care
{                           //un element din nr creste
   int i;                  //verificam daca este
   for(i=1;i<m;i++)        //predecesorul cuiva si daca
      if(c==x[i][0])      //este cazul crestem acea variabila
         if(nr[find(x[i][1])]<=nr[find(c)])
         {
            nr[find(x[i][1])]=nr[find(c)]+1;
            find2(x[i][1]);               //mergem recursiv facand acelas lucru si pentru caracterul a carui valoare din nr a crescut
         }
	return 0;
}
int main(void)
{

   int nr2,NR;
   ifstream f("sortaret.in");
   ofstream g("sortaret.out");         //fisiere
   int a,b;
   f>>a; f>>b;
   while(f)
   {
      f>>x[++m][0];
	  f>>x[m][1];     //citire
      if(!f)                     //oprim while cand
         break;                 //nu mai e nimic de citit
      if(find1(x[m][0])==0)      //pentru cazul in care
      {                          //avem o litera noua
         ch[++n]=x[m][0];       //o adaugam
         nr[n]=1;
      }
      if(find1(x[m][1])==0)      // in cazul in care avem o
      {                          // litera noua o agaugam
         ch[++n]=x[m][1];       // si ii dam valoarea
         nr[n]=find1(x[m][0])+1; //predecesorului +1
      }
      else
      {
         if(find1(x[m][0])+1>nr[find(x[m][1])])    //daca nu e noua
         {                                         //verificam daca nu cumva trebuie marita
            nr[find(x[m][1])]=find1(x[m][0])+1;     // verificam daca nu cumva e predecesoru cuiva
            find2(x[m][1]);                       //mergem recursiv facand acelas lucru si pentru caracterul a carui valoare din nr a crescut
         }
      }
   }
   sort();               //sort
   for(int i=1;i<=n;i++)   //afisarea
      g<<ch[i]<<" ";
}