Cod sursa(job #1082339)

Utilizator misu007Pogonaru Mihai misu007 Data 14 ianuarie 2014 15:20:01
Problema Parcurgere DFS - componente conexe Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
using namespace std;

int n,m,c=0;
struct varf
{
    varf* u;
    int x;
}*v[100001];

struct lista
{
    lista *u,*a;
    int x;
}*p,*poz[100001];

void adaugavecin(int x,int y)
{
    varf *p;
    p=new varf;
    p->u=v[x];
    p->x=y;
    v[x]=p;
}

void read()
{
    freopen("dfs.in","r",stdin);
    scanf("%d%d",&n,&m);
    int x,y;
    while(m)
    {
        --m;
        scanf("%d%d",&x,&y);
        --x;--y;
        adaugavecin(x,y);
        adaugavecin(y,x);
    }
}

void parcur(int x)
{
    if(p==poz[x])
    {
        p=poz[x]->u;
    }
    else
    {
        poz[x]->a->u=poz[x]->u;
    }
    poz[x]='\0';
    while(v[x])
    {
        if(poz[v[x]->x]) parcur(v[x]->x);
        v[x]=v[x]->u;
    }
}

void write()
{
    freopen("dfs.out","w",stdout);
    printf("%d",c);
}

int main()
{
    read();
    poz[n-1]=new lista;
    poz[n-1]->u='\0';
    poz[n-1]->x=n-1;
    p=poz[n-1];
    for(int i=n-2;i>=0;--i)
    {
        poz[i]=new lista;
        poz[i]->x=i;
        poz[i]->u=p;
        p->a=poz[i];
        p=poz[i];
    }
    p->a='\0';
    while(p)
    {
        ++c;
        parcur(p->x);
    }
    write();
    return 0;
}