Pagini recente » Cod sursa (job #2576924) | Cod sursa (job #698805) | Cod sursa (job #2406602) | Cod sursa (job #2983348) | Cod sursa (job #2107488)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
FILE *f = fopen("ctc.in","r");
FILE *g = fopen("ctc.out","w");
const int NMAX = 100000;
int N,M,Q;
int lowest[20][NMAX + 5];
int gr[NMAX + 5];
vector<int> G[NMAX + 5];
vector<int> DAG[NMAX + 5];
vector<int> T[NMAX + 5];
vector<vector<int> > CTC;
int low[NMAX + 5];
int id[NMAX + 5];
int st[NMAX + 5];
bool inst[NMAX + 5];
int len,lastid;
int comp[NMAX + 5];
int nrcomp;
int X[NMAX + 5];
int Y[NMAX + 5];
void ctc(int nod){
low[nod] = id[nod] = ++lastid;
st[++len] = nod;
inst[nod] = 1;
for(auto it:G[nod]){
if(!id[it]){
ctc(it);
}
if(inst[it]){
low[nod] = min(low[nod],low[it]);
}
}
if(low[nod] == id[nod]){
vector<int> tmp;
++nrcomp;
while(st[len] != nod){
comp[st[len]] = nrcomp;
inst[st[len]] = 0;
tmp.push_back(st[len]);
len--;
}
len--;
comp[nod] = nrcomp;
inst[nod] = 0;
tmp.push_back(nod);
CTC.push_back(tmp);
}
}
int main() {
fscanf(f,"%d %d",&N,&M);
for(int i = 1;i <= M;i++){
fscanf(f,"%d %d",&X[i],&Y[i]);
G[X[i]].push_back(Y[i]);
}
ctc(1);
fprintf(g,"%d\n",(int)CTC.size());
for(auto it:CTC){
for(auto it2:it){
fprintf(g,"%d ",it2);
}
fputc('\n',g);
}
fclose(f);
fclose(g);
return 0;
}