#include <stdio.h>
#include <stdlib.h>
typedef struct{
int n, **matrix;
} graph;
enum {white, gray, black};
void read_graph(graph *g){
int m;
scanf("%d %d", g, &m);
g->matrix=calloc(g->n, sizeof(int*));
for(int i=0; i<g->n; i++){
g->matrix[i]=calloc(g->n, sizeof(int));
}
int v, w;
for(int i=0; i<m; i++){
scanf("%d %d", &v, &w);
g->matrix[v-1][w-1]=1;
}
}
void read_graph_file(graph *g, FILE *pf){
int m;
fscanf(pf, "%d %d", &g->n, &m);
int i;
g->matrix=(int **)calloc(g->n, sizeof(int*));
for(int i=0; i<g->n; i++){
g->matrix[i]=(int *)calloc(g->n, sizeof(int));
}
int v, w;
for(int i=0; i<m; i++){
fscanf(pf, "%d %d", &v, &w);
g->matrix[v-1][w-1]=1;
}
}
void print_graph(graph g){
for(int i=0; i<g.n; i++){
for(int j=0; j<g.n; j++){
printf("%d ", g.matrix[i][j]);
}
putchar(10);
}
}
void delete_graph(graph *g){
for(int i=0; i<g->n; i++){
free(g->matrix[i]);
}
free(g->matrix);
g->matrix=0;
g->n=0;
}
void dfs(graph g, int node, int *time, int *top_sort, int *vizitat){
vizitat[node]=gray;
//printf("%d ", node);
for(int i=0; i<g.n; i++){
if(!vizitat[i]&&g.matrix[node][i]){
dfs(g, i, time, top_sort, vizitat);
}
}
vizitat[node]=black;
(*time)--;
top_sort[*time]=node;
}
void dfs_tr(graph g, int node, int *vizitat, FILE *pf){
vizitat[node]=gray;
fprintf(pf, "%d ", node+1);
for(int i=0; i<g.n; i++){
if(!vizitat[i]&&g.matrix[i][node]){
dfs_tr(g, i, vizitat, pf);
}
}
vizitat[node]=black;
}
graph g;
int *vizitat, *top_sort, time, comp_conex;
int main()
{ FILE *pf=fopen("ctc.txt", "r");
read_graph_file(&g, pf);
fclose(pf);
// print_graph(g);
time=g.n;
vizitat=(int *)calloc(time, sizeof(int));
top_sort=(int *)calloc(time, sizeof(int));
for(int i=0; i<g.n; i++){
if(!vizitat[i]){
dfs(g, i, &time, top_sort, vizitat);
}
}
// putchar(10);
/*for(int i=0; i<g.n; i++){
printf("%d ", top_sort[i]);
}*/
for(int i=0; i<g.n; i++){
vizitat[i]=0;
}
pf=fopen("ctc0.txt", "w");
fprintf(pf, "\n");
for(int i=0; i<g.n; i++){
if(!vizitat[top_sort[i]]){
comp_conex++;
dfs_tr(g, top_sort[i], vizitat, pf);
fputc(10, pf);
}
}
fseek(pf, 0, SEEK_SET);
fprintf(pf, "%d", comp_conex);
fclose(pf);
free(top_sort);
free(vizitat);
delete_graph(&g);
return 0;
}