Pagini recente » Cod sursa (job #2947130) | Cod sursa (job #979414) | Cod sursa (job #2986941) | Cod sursa (job #2370983) | Cod sursa (job #459265)
Cod sursa(job #459265)
//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;
}