Cod sursa(job #2744695)

Utilizator MaxamPJORares Daniel MaxamPJO Data 24 aprilie 2021 23:19:32
Problema Componente tare conexe Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.45 kb
#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, &m);
int i;
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++){
    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=calloc(time, sizeof(int));
    top_sort=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;
}