Cod sursa(job #2927852)

Utilizator Silviu_StefanStefan Silviu Silviu_Stefan Data 21 octombrie 2022 18:06:28
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#pragma GCC optimize("O1")
#pragma GCC optimize("O2")
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
char buff[4096];
int pbuf=4095;
void readbuff(){
    pbuf=0;fin.read(buff,4095);
}
int citire(){
    int nr=0;
    if(pbuf==4095){
        readbuff();
    }
    while(buff[pbuf]<'0'||buff[pbuf]>'9'){
        pbuf++;
        if(pbuf==4095){
            readbuff();
        }
    }
    while(buff[pbuf]>='0'&&buff[pbuf]<='9'){
        nr=nr*10+buff[pbuf]-'0';pbuf++;
        if(pbuf==4095){
            readbuff();
        }
    }
    return nr;
}
vector<int>G[100005];
vector<int>GT[100005];
int ordine[100005];
bool viz[100005];int poz;
void DFS(int nod){
    viz[nod]=1;
    for(int i=0;i<G[nod].size();i++){
        if(viz[G[nod][i]]==0){
            DFS(G[nod][i]);
        }
    }
    poz++;ordine[poz]=nod;
}
int nr[100005],val;
int v[100005],pozv;
void DFS1(int nod){
    nr[nod]=val;
    for(int i=0;i<G[nod].size();i++){
        if((nr[G[nod][i]]%2==1&&nr[G[nod][i]]!=val)||nr[G[nod][i]]==0){
            DFS1(G[nod][i]);
        }
    }
}
void DFS2(int nod){
    nr[nod]=val;
    for(int i=0;i<GT[nod].size();i++){
        if(nr[GT[nod][i]]==val-1){
            DFS2(GT[nod][i]);
        }
    }
}
vector<int>componenta[100005];
int f[300005];
int main()
{
    int n,m,a,b;n=citire();m=citire();
    for(int i=1;i<=m;i++){
        a=citire();b=citire();
        G[a].push_back(b);
        GT[b].push_back(a);
    }
    poz=0;
    for(int i=1;i<=n;i++){
        if(viz[i]==0){
            DFS(i);
        }
    }val=1;
    for(int i=1;i<=poz;i++){
        if(nr[ordine[i]]%2==1||nr[ordine[i]]==0){
            DFS1(ordine[i]);val++;
            DFS2(ordine[i]);val++;
        }
    }
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(f[nr[i]]==0){
            cnt++;f[nr[i]]=cnt;
        }
        componenta[f[nr[i]]].push_back(i);
    }
    fout<<cnt<<'\n';
    for(int i=1;i<=cnt;i++){
        for(int j=0;j<componenta[i].size();j++){
            fout<<componenta[i][j]<<" ";
        }
        fout<<'\n';
    }
    return 0;
}