Cod sursa(job #229665)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 10 decembrie 2008 23:46:02
Problema Parcurgere DFS - componente conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<stdio.h>
#include<string.h>

struct nod
{int info;
nod *nod_urm;
};
nod *Sfarsit,**ListaFii;
int N,M,cnt=0,*stiva;
bool *s;

void adauga(int tata,int fiu)
{nod *aux;
aux=new nod;
aux->info=fiu;
aux->nod_urm=ListaFii[tata];
ListaFii[tata]=aux;}

void pregateste()
{
FILE *pin=fopen("dfs.in","r");
fscanf(pin,"%d",&N);
fscanf(pin,"%d",&M);

Sfarsit=new nod;
ListaFii=new nod*[N+1];
s=new bool[N+1];
stiva=new int[N+1];

memset(s,0,N+1);

for(int i=1;i<=N;i++)
  ListaFii[i]=Sfarsit;

int a,b;
for(int i=1;i<=M;i++)
  {fscanf(pin,"%d",&a);
  fscanf(pin,"%d",&b);
  adauga(a,b);
  adauga(b,a);}

fclose(pin);
}

void dfs(int tata)
{
int nivel=1;
stiva[nivel]=tata;
s[tata]=1;
nod *aux;
if(ListaFii[tata]!=Sfarsit)
  while(nivel>=1)
    {
    aux=ListaFii[stiva[nivel]];
      while(aux->nod_urm!=Sfarsit && s[aux->info]==1)
        aux=aux->nod_urm;
    if(aux->nod_urm!=Sfarsit || s[aux->info]==0)
      {
      stiva[++nivel]=aux->info;
      s[aux->info]=1;
      }
    else
      nivel--;
    }
}

void rezolva()
{
for(int i=1;i<=N;i++)
  if(!s[i])
    {
    dfs(i);
    cnt++;
    }
}

void incheie()
{delete Sfarsit;
delete []ListaFii;
FILE *pout=fopen("dfs.out","w");
fprintf(pout,"%d",cnt);
fclose(pout);
}

int main()
{pregateste();
rezolva();
incheie();
return 0;
}