Cod sursa(job #1249747)

Utilizator serban.cobzacCobzac Serban serban.cobzac Data 27 octombrie 2014 13:33:05
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#define dmax 5005
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");

int m2[dmax], m1[dmax], g[dmax][dmax], gt[dmax][dmax], n, m, lg1, lg2, nrCtc;
bool uz[dmax], fol[dmax];

void citire();
void rez();
void dfs(int, int[], int&, int[][dmax]);
inline void clear_uz();
void ctc(int);
void clear();

int main(){
    citire();
    rez();
    return 0;
}

void citire(){
    int x, y;
    fin>>n>>m;
    for(int i=1; i<=m; ++i){
        fin>>x>>y;
        g[x][ ++g[x][0] ]=y;
        gt[y][ ++gt[y][0] ]=x;
    }
}

void rez(){
    for(int i=1; i<=n; ++i)
        if(!fol[i]){
            dfs(i, m1, lg1, g);
            clear_uz();
            dfs(i, m2, lg2, gt);
            clear_uz();
            ctc(i);
            clear();
        }
}

void dfs(int vf, int a[], int &lg, int m[][dmax]){
    uz[vf]=1; a[++lg]=vf;
    for(int i=1; i<=m[vf][0]; ++i)
        if(!uz[ m[vf][i] ])
            dfs(m[vf][i], a, lg, m);
}

inline void clear_uz(){
    for(int i=1; i<=dmax; ++i) uz[i]=0;
}

void ctc(int vf){
    int i, j;
    fout<<++nrCtc<<": "<<vf<<' ';
    fol[vf]=1;
    for(i=1; i<=lg1; ++i)
        for(j=1; j<=lg2; ++j)
            if(m1[i]==m2[j] && m1[i]!=vf){
                fol[m1[i]]=1;
                fout<<m1[i]<<' ';
            }
    fout<<'\n';
}

void clear(){
    int i;
    for(i=1; i<=lg1+1; ++i) m1[i]=0;
    for(i=1; i<=lg2+1; ++i) m2[i]=0;
    lg1=lg2=0;
}