Cod sursa(job #807027)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 3 noiembrie 2012 22:16:44
Problema Strazi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<fstream>
using namespace std;
typedef struct celula{
             int nod;
             celula *next;
             }*lista;
lista graf[266],v;
int n,m,x,y,lant[256][256],nrl,i,nrn[256],h[266];
bool viz[266];

void dfs(int nod){
     if (graf[nod]==0) h[nod]=1; else
     for (lista p=graf[nod]; p; p=p->next){
      if (h[p->nod]==0) dfs(p->nod); h[nod]=max(h[nod],h[p->nod]+1);}
}

void form(int nod){
     viz[nod]=1;
     for (lista p=graf[nod]; p; p=p->next)
      if (viz[p->nod]==0&&h[p->nod]==h[nod]-1){++nrn[nrl]; lant[nrl][nrn[nrl]]=p->nod; form(p->nod); break; }
}

int main(void){
    ifstream fin("strazi.in");
    ofstream fout("strazi.out");
    fin>>n>>m;
    for (i=1; i<=m; ++i){
        fin>>x>>y;
        v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
        }
    for (i=1; i<=n; ++i)if (h[i]==0) dfs(i);
    for (i=1; i<=n; ++i)if (viz[i]==0){++nrl; nrn[nrl]=1; lant[nrl][1]=i;  form(i);}
     fout<<nrl-1<<"\n";
      for (i=1; i<nrl; ++i)fout<<lant[i][nrn[i]]<<" "<<lant[i+1][1]<<"\n";
     for (i=1; i<=nrl; ++i)
      for (int j=1; j<=nrn[i]; ++j) fout<<lant[i][j]<<" ";
 return(0);
}