Cod sursa(job #459265)

Utilizator S7012MYPetru Trimbitas S7012MY Data 28 mai 2010 18:36:09
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
//determinarea componentelor tare conexe cu ajutorul algoritmului lui tarjan
//
#include <cstdio>
#include <cstring>
#include <vector>
#include <stack>
#define minim(a, b)  ((a) < (b) ? (a) : (b))
using namespace std;

int n,m,viz[100001],ind[100001],lowlink[100001],iindex,varf;
vector<int> conexe;
stack<int> stiva;
vector <vector<int> > sol;

struct nod {
    int x;
    nod *urm;
} *v[100001];

void adaugare (int x, int y) {
    nod *p;
    p=new nod;
    p->urm=v[x];
    p->x=y;
    v[x]=p;
}

void tarjan(const int z) {
    nod *p;
    ind[z]=lowlink[z]=iindex;
    ++iindex;
    stiva.push(z);
    viz[z]=1;
    for(p=v[z];p!=NULL; p=p->urm)
        if(ind[p->x]==-1) {
            tarjan(p->x);
            lowlink[z]=minim(lowlink[z],lowlink[p->x]);
        }
        else if(viz[p->x])
            lowlink[z]=minim(lowlink[z],lowlink[p->x]);
    if(ind[z]==lowlink[z]) {
        conexe.clear();
        int nod;
        do{
            nod = stiva.top();
            conexe.push_back(nod);
            stiva.pop(), viz[nod] = 0;
        }while(nod!=z);
        sol.push_back(conexe);
    }
}

int main()
{
    int i,x,y;
    freopen("ctc.in","r",stdin);
    freopen("ctc.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1; i<=n; i++) {
        scanf("%d %d",&x,&y);
        adaugare(x,y);
    }
    memset(ind,-1,sizeof(ind));
    for(i=1; i<=n; i++) if(ind[i]==-1)
    tarjan(i);
    for (size_t i = 0; i < sol.size(); ++ i) {
        for (size_t j = 0; j < sol[i].size(); ++ j)
           printf("%d ",sol[i][j] + 1 );
       printf("\n");
    }
    return 0;
}