Cod sursa(job #2670507)

Utilizator petrualbert01Gavrilescu Albert petrualbert01 Data 10 noiembrie 2020 01:59:13
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
/// Algoritmul Kosaraju - Sharir
#include <fstream>

using namespace std;

ofstream fout("ctc.out");

struct nod
{
    int info;
    nod *urm;
};

nod *g[100001], *gt[100001], *comp[100001];
int n, m;
int viz[100001], stiva[100001], nrc, nr;

void Citire()
{
    ifstream fin("ctc.in");
    int x,y;
    nod *p;
    fin>>n>>m;
    while (m--)
    {
        fin>>x>>y;
        p=new nod; p->info=y; p->urm=g[x]; g[x]=p;    /// graful nostru
        p=new nod; p->info=x; p->urm=gt[y]; gt[y]=p;  /// graful transpus
   }
   fin.close();
}

/// vom memora in stiva varfurile arborelui de parcurgere in ordinea descrescatoare a timpului de terminare
void dfs(int vf)
{
    int i;
    nod *p;
    viz[vf]=1;
    for (p=g[vf];p!=NULL;p=p->urm) /// parcurrgem varfurile
    {
        i=p->info;
        if (!viz[i]) /// daca nodul n a fost vizitat
            dfs(i);
    }
    stiva[++nr]=vf; /// adaugam nodul in stiva
}
///
void dfst(int vf)
{
    nod *p;
    int i;
    viz[vf]=0;
    p=new nod; p->info=vf; p->urm=comp[nrc]; comp[nrc]=p; /// cream componentele conexe
    for (p=gt[vf];p!=NULL;p=p->urm)  /// cautam varfurile vecine nevizitate inca
    {
        i=p->info;
        if (viz[i])
            dfst(i); /// repetam procesul
    }
}

void Afisare()
{
    int i;
    nod *p;
    for (i=1;i<=nrc;i++)
    {
        for (p=comp[i];p!=NULL;p=p->urm)   /// afisam componentele conexe din lista creata "comp"
            fout<<p->info<<" ";
        fout<<"\n";
    }
}
int main()
{

    int i;
    Citire();

    for (i=1;i<=n;i++)
        if (!viz[i])
            dfs(i);

    for (i=n;i>0;i--)    /// parcurgem in sens descrescator stiva, adica de la varf la baza
        if (viz[stiva[i]])
        {
            nrc++;
            dfst(stiva[i]);
        }
    fout<<nrc<<"\n";
    Afisare();

    fout.close();
    return 0;
}