Cod sursa(job #2668110)

Utilizator anacomoAna-Maria Comorasu anacomo Data 4 noiembrie 2020 15:04:12
Problema Componente tare conexe Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m, node_order_count, culoare, node_order[100000], visited[100000];
vector<vector<int>> graf, grafTranspus, componente;

void dfs1(int node)
{
    visited[node] = 1;

    for (int i = 0; i < (int)graf[node].size(); i++)
        if (!visited[graf[node][i]])
            dfs1(graf[node][i]);

    node_order[node_order_count++] = node;
}

void dfs2(const int node)
{
    visited[node] = 2;

    componente[culoare].push_back(node);

    for (int i = 0; i < (int)grafTranspus[node].size(); i++)
        if (visited[grafTranspus[node][i]] == 1)
            dfs2(grafTranspus[node][i]);
}

int main()
{
    fin >> n >> m;

    graf.resize(100000);
    grafTranspus.resize(1000000);
    componente.resize(1000000);

    for (int i = 1; i <= m; i++)
    {
        int x, y;
        fin >> x >> y;

        graf[x].push_back(y);
        grafTranspus[y].push_back(x);
    }

    for (auto i = 1; i <= n; i++)
        if (!visited[i])
            dfs1(i);

    for (auto i = node_order_count - 1; i >= 0; i--)
    {
        if (visited[node_order[i]] != 2)
        {
            dfs2(node_order[i]);
            culoare++;
        }
    }

    fout << culoare << "\n";
    for (auto i = 0; i < culoare; i++)
    {
        for (auto node : componente[i])
            fout << node << " ";
        fout << "\n";
    }

    fout.close();
    return 0;
}