Cod sursa(job #2086877)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 12 decembrie 2017 17:07:10
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("ctc.in");
ofstream cout("ctc.out");
const int nm=100000;
vector<int>v1[nm+5];
int l1[nm+5];
vector<int>v2[nm+5];
int l2[nm+5];
int n,m;
int a,b;
int viz1[nm+5],nr1=0;
int viz2[nm+5],nr2=0;
void dfs1(int nod)
{
    viz1[nod]=nr1;
    for(int i=0;i<l1[nod];i++)
        if(viz1[v1[nod][i]]==0)
            dfs1(v1[nod][i]);
}
void dfs2(int nod)
{
    viz2[nod]=nr2;
    for(int i=0;i<l2[nod];i++)
        if(viz2[v2[nod][i]]==0)
            dfs2(v2[nod][i]);
}
struct fint
{
    int a,b,ind;
};
fint sol[nm+5];
bool cmp(fint x,fint y)
{
    if(x.a==y.a)
    {
        if(x.b==y.b)
            return x.ind<y.ind;
        return x.b<y.b;
    }
    return x.a<y.b;
}
int unde=0;
vector<int>cine[nm+5];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b;
        v1[a].push_back(b);
        v2[b].push_back(a);
    }
    for(int i=1;i<=n;i++)
    {
        l1[i]=v1[i].size();
        l2[i]=v2[i].size();
    }
    for(int i=1;i<=n;i++)
        if(viz1[i]==0)
        {
            nr1++;
            dfs1(i);
        }
    for(int i=1;i<=n;i++)
        if(viz2[i]==0)
        {
            nr2++;
            dfs2(i);
        }
    for(int i=1;i<=n;i++)
        {
            sol[i].ind=i;
            sol[i].a=viz1[i];
            sol[i].b=viz2[i];
        }
    sort(sol+1,sol+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        if(sol[i].a!=sol[i-1].a or sol[i].b!=sol[i-1].b)
            unde++;
        cine[unde].push_back(sol[i].ind);
    }
    cout<<unde<<"\n";
    for(int i=1;i<=unde;i++)
    {
        for(int j=0;j<cine[i].size();j++)
            cout<<cine[i][j]<<" ";
        cout<<"\n";
    }
    return 0;
}
/**
**/