Pagini recente » Cod sursa (job #1487353) | Cod sursa (job #2697533) | Cod sursa (job #1772008) | Cod sursa (job #2242657) | Cod sursa (job #798059)
Cod sursa(job #798059)
#include <cstdio>
using namespace std;
int n,m;
struct nod{
int x;
nod *urm;
};
struct varf{
int ok;
int viz;
nod *p;
nod *u;
}*a[1000000];
void adaugare_prim(int x,nod *&p,nod *&u)
{
p=new nod;
p->x=x;
p->urm=NULL;
u=p;
}
void adaugare_sf(int x,nod *&u)
{
nod *q=new nod;
q->x=x;
q->urm=NULL;
u->urm=q;
u=q;
}
void stergere (nod *&l)
{
nod *q=l->urm;
if(l->urm){
l->x=l->urm->x;
l->urm=l->urm->urm;
}else{
delete l;
l=NULL;
}
delete q;
}
nod *c,*uc,*sol,*solu;
void citire ()
{
freopen("sortaret.in","r",stdin);
int x,y;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
a[i]=new varf;
a[i]->viz=0;
a[i]->ok=0;
a[i]->p=NULL;
a[i]->u=NULL;
}
for(int i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
if(!a[x]->p){
adaugare_prim(y,a[x]->p,a[x]->u);
}
else
adaugare_sf(y,a[x]->u);
a[y]->ok=1;
}
for(int i=1;i<=n;i++)
if(a[i]->ok==0){
if(!c)
adaugare_prim(i,c,uc);
else
adaugare_sf(i,uc);
}
}
int ver(int x)
{
for(int i=1;i<=n;i++)
for(nod *j=a[i]->p;j;j=j->urm)
if(j->x==x)
return 0;
return 1;
}
void parc ()
{
for(nod *i=c;i;i=i->urm){
if(!sol)
adaugare_prim(i->x,sol,solu);
else
adaugare_sf(i->x,solu);
for(;a[i->x]->p;){
int x=a[i->x]->p->x;
stergere(a[i->x]->p);
if(ver(x))
adaugare_sf(x,uc);
}
}
}
void afisare ()
{
freopen("sortaret.out","w",stdout);
for(nod *i=sol;i;i=i->urm)
printf("%d ",i->x);
printf("\n");
}
int main ()
{
citire();
parc();
afisare();
return 0;
}