Cod sursa(job #767150)

Utilizator igsifvevc avb igsi Data 12 iulie 2012 20:48:07
Problema Componente tare conexe Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.48 kb
#include<stdlib.h>
#include<stdio.h>

struct node{
    int value;
    struct node *next;
} *G[100001], *Gt[100001], *r[100001];
int N, nrComp, visited[100001], stack[100001];
FILE *in, *out;

void df1(int i)
{
    struct node *p;
    visited[i] = 1;

    for(p = G[i]; p; p = p->next)
        if(!visited[p->value])
            df1(p->value);
    stack[++stack[0]] = i;
}

void df2(int i)
{
    struct node *p, *t;
    visited[i] = 0;
    
    t = malloc(sizeof(struct node));
    t->value = i;
    t->next = r[nrComp];
    r[nrComp] = t;

    for(p = Gt[i]; p; p = p->next)
        if(visited[p->value])
            df2(p->value);
}

int main(){
    int i, M, a, b;
    struct node *p;
    
    in = fopen("ctc.in", "r");
    out = fopen("ctc.out", "w");

    fscanf(in, "%d %d", &N, &M);
    for(; M; --M){
        fscanf(in, "%d %d", &a, &b);
        p = malloc(sizeof(struct node));
        p->value = b;
        p->next = G[a];
        G[a] = p;

        p = malloc(sizeof(struct node));
        p->value = a;
        p->next = Gt[b];
        Gt[b] = p;
    }

    for(i = 1; i <= N; ++i)
        if(!visited[i]){
            df1(i);
        }

    for(nrComp = 0, i = N; i; --i)
        if(visited[stack[i]]){
            ++nrComp;
            df2(stack[i]);
        }

    fprintf(out, "%d\n", nrComp);
    for(i = 1; i <= nrComp; ++i)
    {
        for(p = r[i]; p; p = p->next)
                fprintf(out, "%d ", p->value);
        fprintf(out, "\n");
    }

    fclose(in);
    fclose(out);
    return 0;
}