Cod sursa(job #3315650)

Utilizator RaduCalisovCalisovRadu RaduCalisov Data 15 octombrie 2025 14:51:03
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;
int n;
vector<vector<int>> v;
vector<vector<int>> vt;
vector<int> checked;
vector<pair<int,int>> finals;
stack<int> sk;

bool cmp(pair<int,int> a,pair<int,int> b){
    return a.first > b.first;
}

void dfs_n(int nod){
    for(int i=0;i<v[nod].size();i++){
        int newnod = v[nod][i];
        if(checked[newnod] == 0){
            checked[newnod] = 1;
            dfs_n(newnod);
        }
    }
    sk.push(nod);
}

void dfs_tr(int nod,int cnt){
    finals[nod] = {cnt,nod};

    for(int i=0;i<vt[nod].size();i++){
        int newnod = vt[nod][i];
        if(checked[newnod] == 1){
            checked[newnod] = 2;
            dfs_tr(newnod,cnt);
        }
    }
}

int main(){
    ifstream cin("ctc.in");
    ofstream cout("ctc.out");

    int m;
    cin>>n>>m;
    v.resize(n+1);
    finals.resize(n+1);
    vt.resize(n+1);
    checked.resize(n+1,0);

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

        v[x].push_back(y);
        vt[y].push_back(x);
    }

    for(int i=1;i<=n;i++){
        if(checked[i]==0){
            checked[i]=1;
            dfs_n(i);
        }
    }
    int total=0;
    while(sk.size()){
        int nod = sk.top();
        sk.pop();

        if(checked[nod]==1){
            checked[nod] = 2;
            total++;
            dfs_tr(nod,total);
        }
    }
    cout<<total<<"\n";
    sort(finals.begin()+1,finals.end(),cmp);

    for(int i=1;i<=n;i++){
        if(finals[i].first!=finals[i-1].first and i>1)
            cout<<"\n";
        cout<<finals[i].second<<" ";
    }
}