Pagini recente » Cod sursa (job #2545482) | Cod sursa (job #1665341) | Cod sursa (job #277035) | Cod sursa (job #2787198) | Cod sursa (job #2295661)
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<stack>
using namespace std;
#define MAXN 100000
#define MAXM 200000
int M,N;
vector<int> L[MAXN+1];
bool viz[MAXN+1];
typedef struct nod{
int index;
int low;
bool instack;
}nod;
nod V[MAXN+1];
int S[MAXN];
int stackindex;
int index=1;
int nbcomp;
vector<int> C[MAXN];
void componente(int nod){
stack<pair<int,vector<int>::iterator>> stk;
vector<int>::iterator it,temp;
int vecin;
bool go=true;
do{
if(!go){ //comeback
nod=stk.top().first;
temp=stk.top().second;
stk.pop();
vecin=*temp;
if(V[nod].low > V[vecin].low)
V[nod].low = V[vecin].low;
temp++;
}
else{
viz[nod]=true;
V[nod].index = index;
V[nod].low = index;
V[nod].instack = true;
index++;
S[stackindex]=nod;
stackindex++;
temp=L[nod].begin();
}
go=false;
for(it=temp;it!=L[nod].end();it++){
vecin=*it;
if(!viz[vecin]){
//componente(vecin);
stk.push(make_pair(nod,it));
nod=vecin;
go=true;
break;
}
else{
if(V[vecin].instack){
if(V[nod].low > V[vecin].index)
V[nod].low = V[vecin].index;
}
}
}
if(go)
continue;
if (V[nod].low == V[nod].index){
// start a new strongly connected component
while(S[stackindex-1]!=nod){
C[nbcomp].push_back(S[stackindex-1]);
V[S[stackindex-1]].instack=false;
stackindex--;
}
C[nbcomp].push_back(S[stackindex-1]);
V[S[stackindex-1]].instack=false;
stackindex--;
nbcomp++;
}
}while(!stk.empty());
}
int main(){
freopen("ctc.in", "r", stdin);
//freopen("ctc_test10.in", "r", stdin);
freopen("ctc.out", "w", stdout);
scanf("%d %d",&N,&M);
int x,y;
for(int i=0;i<M;i++){
scanf("%d %d",&x,&y);
if(x!=y)
L[x].push_back(y);
}
for(int i=1;i<=N;i++){
if(!viz[i])
componente(i);
}
printf("%d\n",nbcomp);
vector<int>::iterator it;
for(int i=0;i<nbcomp;i++){
for(it=C[i].begin();it!=C[i].end();it++){
printf("%d ",*it);
}
printf("\n");
}
return 0;
}