Pagini recente » Cod sursa (job #152196) | Cod sursa (job #503085) | Cod sursa (job #128211) | Cod sursa (job #2812731) | Cod sursa (job #637743)
Cod sursa(job #637743)
#include<fstream>
#include <iostream>
using namespace std;
int nr[50000];
int ch[50000],x[50000][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;
for(int i=1;i<=a;i++)
{
ch[++n]=i;
nr[n]=1;
}
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]<<" ";
}