Cod sursa(job #760281)

Utilizator octavianOctavian Crintea octavian Data 20 iunie 2012 19:52:23
Problema Sortare topologica Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.21 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

const float C = 2.0;    // Multiplicativ constant for dynamic list of adj
const char TRUE  = 1;
const char FALSE = 0;

void read(char *file, int *N, int ***adj);
void DFS(int s, int **adj, char *vis, int *nodes, int *p);
void topsort(int N, int **adj, int **nodes);
void write(char *file, int N, int **adj, int *nodes);

int main()
{
    int N, **adj, *nodes;

    read("sortaret.in", &N, &adj);
    topsort(N, adj, &nodes);
    write("sortaret.out", N, adj, nodes);
    
    return 0;
}

void read(char *file, int *N, int ***adj)
{
    FILE *fin;
    int i, j;
    
    fin = fopen(file, "r");
    fscanf(fin, "%d%*d", N);    // We don't need M
    
    *adj = malloc((*N + 1) * sizeof(int *));
    for (i = 1; i <= *N; i++) {
        (*adj)[i] = malloc(2 * sizeof(int));
        (*adj)[i][0] = 2;  // size
        (*adj)[i][1] = 2;  // capacity
    }
    
    while (fscanf(fin, "%d%d", &i, &j) == 2) {
        if ((*adj)[i][0] == (*adj)[i][1]) {
            (*adj)[i] = realloc((*adj)[i], ceil(C * (*adj)[i][1]) * sizeof(int));
            (*adj)[i][1] = ceil(C * (*adj)[i][1]);
        }
        (*adj)[i][(*adj)[i][0]] = j;
        (*adj)[i][0]++;
    }
    
    fclose(fin);
}

void DFS(int s, int **adj, char *vis, int *nodes, int *p)
{
    int i;
    for (i = 2; i < adj[s][0]; i++) {
        if (!vis[adj[s][i]]) {
            vis[adj[s][i]] = TRUE;
            DFS(adj[s][i], adj, vis, nodes, p);
        }
    }
    nodes[*p] = s;
    (*p)--;
}

void topsort(int N, int **adj, int **nodes)
{
    char *vis;
    int i, p;
    
    *nodes = malloc((N + 1) * sizeof(int));
    vis = malloc((N + 1) * sizeof(char));
    for (i = 1; i <= N; i++) {
        vis[i] = FALSE;
    }
    
    p = N;  // position in the nodes array
    for (i = 1; i <= N; i++) {
        if (!vis[i]) {
            vis[i] = TRUE;
            DFS(i, adj, vis, *nodes, &p);
        }
    } 
    
    free(vis);  
}

void write(char *file, int N, int **adj, int *nodes)
{
    FILE *fout;
    int i;
    
    fout = fopen(file, "w");
    for (i = 1; i <= N; i++) {
        fprintf(fout, "%d ", nodes[i]);
    }
    fclose(fout);
    
    for (i = 1; i <= N; i++) {
        free(adj[i]);
    }
    free(adj);
    free(nodes);
}