Cod sursa(job #2481855)

Utilizator Dragos1226Dragos Chileban Dragos1226 Data 27 octombrie 2019 15:08:57
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
const int NMax = 100000;
vector <int> G[NMax+5];
vector <int> T[NMax+5];

int N, M, Use[NMax+5], ctc, Sol[NMax+5], k, Topo[NMax+5];

void SortareTopo (int Nod) {
    Use[Nod] = 1;

    for (auto Vecin : G[Nod]) {
        if(!Use[Vecin])
            SortareTopo(Vecin);
    }

    Topo[k++] = Nod;
}

void Read() {
    in >> N >> M;
    for (int i = 0, x, y; i < M; i++) {
        in >> x >> y;
        G[x].push_back(y);
        T[y].push_back(x);
    }
}

void init() {
    for (int i = 1; i <= N; i++)
        if(Use[i] < 2)
            Use[i] = 0;
}

void DFSG(int Nod) {
    Use[Nod] = 1;

    for (auto Vecin : G[Nod]) {
        if(!Use[Vecin])
            DFSG(Vecin);
    }
}

void DFST(int Nod) {
    Use[Nod] = 1;

    for (auto Vecin : T[Nod]) {
        if(!Use[Vecin])
            DFST(Vecin);
    }
}

int main() {
    Read();
    for (int i = 1; i <= N; i++)
        if(!Use[i])
            SortareTopo(i);
    SortareTopo(1);
    k = 0;
    for (int j = N-1; j >= 1; j--) {
            init();
            int i = Topo[j];
            if (!Use[i]) { cout << i;ctc++;
                DFST(i);
                for(int i = 1; i <= N; i++)
                    if(Use[i] == 1)
                        Use[i] = 2,Sol[k++] = i;
                Sol[k++] = 0;
            }
    }
    out << ctc << '\n';
    for (int i = 0; i < k; i++) {
        if(Sol[i])
            out << Sol[i] << " ";
        else
            out << '\n';

    }

}