Cod sursa(job #1495505)

Utilizator NightSilentIridon Stefan NightSilent Data 3 octombrie 2015 10:55:56
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
struct nod
{
    int inf;
    nod *urm;
}*l[100005],*lt[100005];
int n,m;
int u[100005],st[100005],a[100005],nr=0,nc=1;
void adaugnod(nod *&p,int x)
    {
        nod *c;
        c=new nod;
        c->inf=x;
        c->urm=p;
        p=c;
    }
void citire()
{
    int i;
    int x,y;
    f>>n>>m;
    for (i=1;i<=m;i++)
        {
            f>>x>>y;
            adaugnod(l[x],y);
            adaugnod(lt[y],x);

        }

}
void df1(int inf)
{
    nod *p;

    u[inf]=1;

    for (p=l[inf];p;p=p->urm)
        if (!u[p->inf])
            df1(p->inf);
    st[nr++]=inf;


}
void df2(int inf)
{
    nod *p;

    u[inf]=1;

    a[inf]=nc;
    for (p=lt[inf];p;p=p->urm)
        if (!u[p->inf])
            {df2(p->inf);
            nc++;
            }


}

int main()
{
    int i,nc=0;
    citire();
    for (i=1;i<=n;i++)
        if (!u[i])
            df1(i);


    for (i=1;i<=n;i++)
        u[i]=0;
    for (i=n-1;i>=0;i--)
        if (!u[st[i]])
            {

                df2(st[i]);


            }


     nc=1;
    for (i=1;i<n;i++)
        if (a[i]!=a[i+1])
            nc++;
    g<<nc<<'\n';
    for (i=1;i<n;i++)
        {
            g<<i<<" ";
            if (a[i]!=a[i+1])
                g<<'\n';
        }
    g<<n;
    return 0;
}