Cod sursa(job #1369596)

Utilizator IliescuDanAndreiIliescu Dan Andrei IliescuDanAndrei Data 3 martie 2015 10:02:45
Problema Componente tare conexe Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <stack>
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");

int n, m, nr, lst[100001], lstr[100001], vf[200001], vfr[200001], urm[200001], urmr[200001], ccx[100001], index[100001];
bool viz[100001];
stack <int> s;

void dus(int x)
{
    //out<<x<<" ";
    int p, y;
    viz[x]=true;
    p=lst[x];
    while(p)
    {
        y=vf[p];
        if(!viz[y]) dus(y);
        p=urm[p];
    }
    s.push(x);
}

void intors(int x)
{
    int p, y;
    ccx[++nr]=x;
    viz[x]=true;
    p=lstr[x];
    while(p)
    {
        y=vfr[p];
        if(!viz[y]) intors(y);
        p=urmr[p];
    }
}

int main()
{
    int i, j=0, x, y;
    in>>n>>m;
    for(i=1;i<=m;i++)
    {
        in>>x>>y;

        vf[i]=y;
        urm[i]=lst[x];
        lst[x]=i;

        vfr[i]=x;
        urmr[i]=lstr[y];
        lstr[y]=i;

    }
    for(i=1;i<=n;i++) if(!viz[i]) dus(i);
    for(i=1;i<=n;i++) viz[i]=false;
    for(i=1;i<=n;i++)
    {
        x=s.top();
        s.pop();
        if(!viz[x])
        {
            index[++j]=x;
            intors(x);
        }
    }
    out<<j;
    j=1;
    for(i=1;i<=nr;i++)
    {
        if(index[j]==ccx[i])
        {
            j++;
            if(index[j]!=ccx[i+1])
            {
                out<<"\n"<<ccx[i]<<" ";
            }
        }
        else out<<ccx[i]<<" ";
    }
    return 0;
}