Cod sursa(job #1267156)

Utilizator lehman97Dimulescu David lehman97 Data 19 noiembrie 2014 16:51:42
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

FILE *f=fopen("ctc.in","r");
FILE *g=fopen("ctc.out","w");

int viz2[100001],postordine2[100001],postordine[100001],viz[100001],k=0,n,m,i,x,y,nr=0;
vector <int> a[100001],b[100001];

void dfst(int x, int ok)
{
    int i;
    viz[x]=0;
    if(ok==2) fprintf(g,"%d ",x);
    for(i=0;i<b[x].size();i++)
    if(viz[b[x][i]])dfst(b[x][i],ok);
}

void dfs(int x)
{
    int i;
    viz[x]=1;
    for(i=0;i<a[x].size();i++)
    if(!viz[a[x][i]])dfs(a[x][i]);
    postordine[++k]=x;
}

int main()
{
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&x,&y);
        a[x].push_back(y);
        b[y].push_back(x);
    }
    for(i=1;i<=n;i++)
    if(!viz[i]) dfs(i);
    for(i=1;i<=n;i++)
    {
        viz2[i]=viz[i];
        postordine2[i]=postordine[i];
    }
    for(i=n;i>0;i--)
    if(viz[postordine[i]])
    {
        dfst(postordine[i],1);
        nr++;
    }
    fprintf(g,"%d\n",nr);
    swap(viz,viz2);
    swap(postordine,postordine2);
    for(i=n;i>0;i--)
    if(viz[postordine[i]])
    {
        dfst(postordine[i],2);
        fprintf(g,"\n");
    }


    fclose(g);
    return 0;
}