Cod sursa(job #1607515)

Utilizator RaduHHarhoi Radu RaduH Data 21 februarie 2016 12:20:23
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <stack>
#include <queue>
#define N 100010
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n,m,i,j,V[N],nr=0;
char c;
stack <int> Timp;
queue <char> Buffer;
struct nod{
    int info;
    nod *urm;
};
nod *Graf[N], *Transp[N];
void adauga(int i, int j){
    nod *p=new nod, *q=new nod;
    p->info=j;
    p->urm=Graf[i];
    Graf[i]=p;
    q->info=i;
    q->urm=Transp[j];
    Transp[j]=q;
}
void DF(int x, nod* L[], int maxx){
    nod *p;
    p=L[x];
    while(p!=NULL && V[p->info]<maxx)
    {
        V[p->info]++;
        DF(p->info,L,maxx);
        if(maxx==1)
            Timp.push(p->info);
        p=p->urm;
    }
}

int main(){
    fin>>n>>m;
    while(fin>>i>>j)
        adauga(i,j);
    for(i=1;i<=n;i++)
    {
        if(V[i]==0)
        {
            V[i]=1;
            DF(i,Graf,1);
            Timp.push(i);
            while(!Timp.empty())
            {
                V[Timp.top()]++;
                DF(Timp.top(),Transp,2);
                nr++;
                while(!Timp.empty() && V[Timp.top()]==2)
                {
                    m=Timp.top();
                    c=(char)m+48;
                    Buffer.push(c);
                    Buffer.push(' ');
                    Timp.pop();
                }
                Buffer.push('\n');
            }
        }
    }
    fout<<nr<<'\n';
    while(!Buffer.empty())
    {
        fout<<Buffer.front();
        Buffer.pop();
    }
    fin.close();
    fout.close();
    return 0;
}