Cod sursa(job #2823317)

Utilizator cdenisCovei Denis cdenis Data 28 decembrie 2021 00:17:33
Problema Componente tare conexe Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

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

const int M=100005;
int n,m,k,x,y,id[M],lkey[M],inst[M],timp,nr,nrmax,nrc;
vector < int > v[M],sol[M];
stack < int > st;

bool cmp(vector < int > a, vector < int > b)
{
    return *a.begin()<*b.begin();
}

void DFS(int nod)
{
    st.push(nod);
    id[nod]=lkey[nod]=++timp;
    inst[nod]=1;
    for(auto vec : v[nod])
        if(!lkey[vec])
        {
            DFS(vec);
            lkey[nod]=min(lkey[nod],lkey[vec]);
        }
        else if(inst[vec])
            lkey[nod]=min(lkey[nod],lkey[vec]);
    if(lkey[nod]==id[nod])
    {
        nrc++;
        do
        {
            x=st.top();
            sol[nrc].push_back(x);
            inst[x]=0;
            st.pop();
        } while(x!=nod);
    }
}

int main()
{
    fin >> n  >> m;
    while(m--)
    {
        fin >> x >> y;
        v[x].push_back(y);
    }
    for(int i=1;i<=n;i++)
        if(!lkey[i])
            DFS(i);
    for(int i=1;i<=n;i++)
        if(lkey[k]==lkey[i])
            nr++;
    for(int i=1;i<=nrc;i++)
        sort(sol[i].begin(),sol[i].end());
    sort(sol+1,sol+nrc+1,cmp);
    fout << nrc << '\n';
    for(int i=1;i<=nrc;i++)
    {
        for(auto af : sol[i])
            fout << af << " ";
        fout << '\n';
    }
    return 0;
}