Cod sursa(job #2211613)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 11 iunie 2018 10:13:08
Problema Componente tare conexe Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

const int N=100000;

struct info
{
    int a,b,i;
};

int n,m;
vector<int>v[N+5];
vector<int>inv[N+5];
info sol[N+5];

void dfs_v(int nod)
{
    for(auto nou:v[nod])
        if(sol[nou].a==0)
        {
            sol[nou].a=sol[nod].a;
            dfs_v(nou);
        }
}
void dfs_inv(int nod)
{
    for(auto nou:inv[nod])
        if(sol[nou].b==0)
        {
            sol[nou].b=sol[nod].b;
            dfs_inv(nou);
        }
}

bool cmp(info x,info y)
{
    if(x.a==y.a)
        return x.b<y.b;
    return x.a<y.a;
}

int pa=0,pb=0;

int cnt=0;
vector<vector<int>>afis;

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        sol[i].i=i;
    while(m--)
    {
        int a,b;
        fin>>a>>b;
        v[a].push_back(b);
        inv[b].push_back(a);
    }
    for(int i=1;i<=n;i++)
    {
        if(sol[i].a==0)
        {
            sol[i].a=++pa;
            dfs_v(i);
        }
        if(sol[i].b==0)
        {
            sol[i].b=++pb;
            dfs_inv(i);
        }
    }
    sort(sol+1,sol+n+1,cmp);
    cnt++;
    afis.push_back({});
    afis[0].push_back({sol[1].i});
    for(int i=2;i<=n;i++)
    {
        if(cmp(sol[i-1],sol[i])==1)
        {
            cnt++;
            afis.push_back({});
        }
        afis[cnt-1].push_back({sol[i].i});
    }
    fout<<cnt<<"\n";
    for(auto itr:afis)
    {
        for(auto aux:itr)
        {
            fout<<aux<<" ";
        }
        fout<<"\n";
    }
    return 0;
}