Cod sursa(job #2202863)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 10 mai 2018 10:44:05
Problema Componente tare conexe Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include <iostream>
#include <fstream>
#define NEVIZITAT 0

using namespace std;

ifstream in("ctc.in");
ofstream out("ctc.out");

struct elem {
    int val;
    elem * urm;
}*nod[100001];

struct r{
    int val;
    r * urm;
}*raspuns[100001];

int n, m;//date de intrare
int ids[100001], legSlaba[100001];
int nrCompo;
int stiva[100001], varf;
bool seAflaPeStiva[100001];

void adaugareNod(int din,int la){
    elem * deAdaugat = new elem;
    deAdaugat -> val = la;
    deAdaugat -> urm = nod[din];
    nod[din] = deAdaugat;
}

void citire(){
    in >> n >> m;
    for(int i = 1; i <= m; i++){
        int x, y;
        in >> x >> y;
        adaugareNod(x, y);
    }
    in.close();
}

void DF(int plec){
    seAflaPeStiva[plec] = true;//adaug nodul pe stiva
    stiva[++varf] = plec;
    legSlaba[plec] = ids[plec] = plec;//cel mai indepartat nod la care poate ajunge e el insusi momentan

    elem * parcurg = new elem;
    parcurg =  nod[plec];
    while(parcurg != NULL){
        int catre = parcurg -> val;
        if(ids[catre] == NEVIZITAT){
            DF(catre);
        }
        if(seAflaPeStiva[catre] == true){
            legSlaba[plec] = min(legSlaba[catre], legSlaba[plec]);
        }
        parcurg = parcurg -> urm;
    }
    if(ids[plec] == legSlaba[plec]){
        for(int i = stiva[varf--];varf >= 0; i = stiva[varf--]){
            seAflaPeStiva[i] = false;//scoatem componentele de pe stiva
            legSlaba[i] = ids[plec];
            r * ras = new r;
            ras -> val = i;
            ras -> urm = raspuns[ids[plec]];
            raspuns[plec] = ras;
            if(i == plec){
                break;
            }
        }
        nrCompo++;
    }
}

void tarjan(){
    for(int i = 1; i <= n; i++){
        seAflaPeStiva[i] = false;
        ids[i] = NEVIZITAT;
        legSlaba[i] = 0;
    }
    for(int i = 1; i <= n; i++){
        if(ids[i] == NEVIZITAT){
            DF(i);
        }
    }
}

void afisare(){
    out << nrCompo << '\n';
    for(int i = 1; i <= n; i++){
        if(raspuns[i] != NULL){
            r *parcurg = new r;
            parcurg = raspuns[i];
            while (parcurg != NULL){
                out << parcurg -> val <<' ';
                parcurg = parcurg -> urm;
            }
            out << '\n';
        }
    }
}

int main() {
    citire();
    tarjan();
    afisare();
    return 0;
}