Cod sursa(job #1609917)

Utilizator VoicencuVoicencu Teodor Octavian Voicencu Data 23 februarie 2016 10:05:06
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
vector< vector<int> > a;
vector< vector<int> > b;
vector< vector<int> > c;
vector<bool> v;
int p[100001],n,k;
void dfs(int x)
{
    v[x]=true;
    for(vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
        if(v[*i]==false)
        dfs(*i);
    p[++k]=x;
}
void dfss(int x)
{
    v[x]=false;c[k].push_back(x);
    for(vector<int>::iterator i=b[x].begin();i!=b[x].end();i++)
        if(v[*i]==true)
        dfss(*i);
}
int main()
{
    int m,x,y;
    in>>n>>m;
    a=vector< vector<int> >(n+1);
    b=vector< vector<int> >(n+1);
    c=vector< vector<int> >(n+1);
    v=vector<bool>(n+1);
    for(;m;m--)
    {
        in>>x>>y;
        a[x].push_back(y);
        b[y].push_back(x);
    }
    for(int i=1;i<=n;i++)
        if(v[i]==false)
        dfs(i);
    k=0;
    for(int i=n;i;i--)
    if(v[p[i]]==true)
    {
        ++k;
        dfss(p[i]);
    }
    out<<k<<'\n';
    for(int i=1;i<=k;i++)
    {
        for(vector<int>::iterator it=c[i].begin();it!=c[i].end();it++)out<<*it<<' ';
        out<<'\n';
    }
    return 0;
}