Cod sursa(job #2420491)

Utilizator CharacterMeCharacter Me CharacterMe Data 12 mai 2019 12:57:21
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
int N, M, i, j, V, VP;
pair<int, int> P[50001];
bool Check[50001], SCheck[50001];
vector<vector<int> > Graph(50001), Sol(50001); vector<int> Empty;
stack<int> S;
void DFS(int i);
void QSort(int S, int D);
int Arrange(int S, int D);
int main()
{
    freopen("retele.in", "r", stdin);
    freopen("retele.out", "w", stdout);
    scanf("%d%d", &N, &M);
    for(i=0; i<=N; ++i) Sol.push_back(Empty);
    for(i=1; i<=N; ++i) Graph[i].push_back(0);
    for(i=1; i<=M; ++i){
        int x, y;
        scanf("%d%d", &x, &y);
        Graph[x].push_back(y);
        ++Graph[x][0];
    }
    for(i=1; i<=N; ++i) if(Check[i]==false) DFS(i);
    printf("%d\n", V);
    for(i=1; i<=N; ++i){
        if(!Sol[i].empty()){
            printf("%d ", Sol[i].size());
            for(j=0; j<Sol[i].size(); ++j) printf("%d ", Sol[i][j]);
            printf("\n");
        }
    }
    return 0;
}
void DFS(int i){
    int j;
    P[i].first=P[i].second=++VP;
    Check[i]=SCheck[i]=true;
    S.push(i);
    for(j=1; j<=Graph[i][0]; ++j){
        if(Check[Graph[i][j]]==false){
            DFS(Graph[i][j]);
            P[i].second=min(P[i].second, P[Graph[i][j]].second);
        }
        else if(SCheck[Graph[i][j]]==true) P[i].second=min(P[i].second, P[Graph[i][j]].first);
    }
    if(P[i].first==P[i].second){
        ++V;
        vector<int> Vc;
        while(S.top()!=i){
            Vc.push_back(S.top());
            SCheck[S.top()]=false;
            S.pop();
        }
        Vc.push_back(S.top());
        SCheck[S.top()]=false;
        S.pop();
        sort(Vc.begin(), Vc.end());
        int k;
        for(k=0; k<Vc.size(); ++k) Sol[Vc[0]].push_back(Vc[k]);
    }
    return;
}