Cod sursa(job #2790742)

Utilizator AndreiCroitoruAndrei Croitoru AndreiCroitoru Data 29 octombrie 2021 14:03:15
Problema Componente tare conexe Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;
vector <int> v1[100001], v[100001];
pair <int, int> p[100001];
int aux[100001];
bool viz[100001];
int viz1[100001];
int cnt;
void dfs(int nod)
{
    viz[nod] = 1;
    for(auto x:v[nod])
    {
        if(!viz[x])
            dfs(x);
    }
    aux[++cnt] = nod;
}
int k = 1;
void dfs1(int nod)
{
    viz1[nod] = k;
    for(auto x:v1[nod])
    {
        if(!viz1[x])
            dfs1(x);
    }
}

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;
        v[a].push_back(b);
        v1[b].push_back(a);
    }
    for (int i = 1; i <= n; i ++)
    {
        if(!viz[i])
        {
            dfs(i);
        }
    }
    for (int i = n; i >= 1; i--)
    {
        if(!viz1[aux[i]])
        {
            dfs1(aux[i]);
            k++;
        }
    }
    cout << k - 1 << '\n';
    for ( int i = 1; i <= n; i++ )
    {
        p[i].first = i;
        p[i].second = viz1[i];
    }
    sort(p + 1, p + n + 1);
    for ( int i = 1; i <= n; i++)
    {
        if(p[i].second != p[i + 1].second)
        {
            cout << p[i].first << '\n';
        }
        else{
            cout << p[i].first << " ";
        }
    }
    return 0;
}