Cod sursa(job #2871118)

Utilizator AndreiCroitoruAndrei Croitoru AndreiCroitoru Data 12 martie 2022 21:26:51
Problema Componente tare conexe Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

const int N = 100001;
vector <int> g[N];
vector <int> gT[N];
int aux[N];

int nrComponente;
bool verif1[N];
void dfs_1(int node)
{
    verif1[node] = 1;
    for(auto nxt:g[node])
        if(!verif1[nxt])
            dfs_1(nxt);
    aux[++nrComponente] = node;
}

int verif2[N];
int k = 1;
void dfs_2(int node)
{
    verif2[node] = k;
    for(auto nxt: gT[node])
        if(!verif2[nxt])
            dfs_2(nxt);
}

pair<int , int> ans[N];
int main()
{
    ifstream cin("ctc.in");
    ofstream cout("ctc.out");

    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int a, b;
        cin >> a >> b;
        g[a].push_back(b);
        gT[b].push_back(a); /// construim graful transpus
    }
    for(int i = 1; i <= n; i++)
    {
        if(!verif1[i])
            dfs_1(i);
    }
    for(int i = n; i >= 1; i--) /// parcurg graful transpus invers
    {
        if(!verif2[aux[i]])
        {
            dfs_2(aux[i]);
            k++;
        }
    }

    cout << k - 1 << '\n';
    for(int i = 1; i <= n; i++)
    {
        ans[i].first = i;
        ans[i].second = verif2[i];
    }
    sort(ans + 1, ans + n + 1);
    for(int i = 1; i <= n; i++)
    {
        if(ans[i].second == ans[i + 1].second)
            cout << ans[i].first << " ";
        else
            cout << ans[i].first << "\n";
    }

    return 0;
}