Cod sursa(job #1234134)

Utilizator crucerucalinCalin-Cristian Cruceru crucerucalin Data 26 septembrie 2014 19:32:29
Problema Parcurgere DFS - componente conexe Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.01 kb
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "ra_stack.h"


struct node {
    int id;
    struct node *next;
};

void add_node(struct node **adj_list, int x, int y)
{
    struct node *new_node = malloc(sizeof(struct node));
    new_node->id = y;
    new_node->next = adj_list[x];
    adj_list[x] = new_node;
}

void free_list(struct node **list)
{
    if (!*list)
        return;

    if ((*list)->next)
        free_list(&(*list)->next);

    free(*list);
    *list = NULL;
}

void dfs(int node, int *visited_nodes, struct node **adj_list)
{
    struct node *it;
    visited_nodes[node] = 1;
    for (it = adj_list[node]; it; it = it->next)
        if (!visited_nodes[it->id])
            dfs(it->id, visited_nodes, adj_list);
}

void dfs_iter(int node, int *visited_nodes, struct node **adj_list, int N)
{
    struct ra_stack *stack = stack_new(N, sizeof(int));
    stack_push(stack, &node);

    while (!stack_is_empty(stack)) {
        int ver;
        stack_pop(stack, &ver);

        if (!visited_nodes[ver]) {
            struct node *curr_node = adj_list[ver];
            visited_nodes[ver] = 1;

            while (curr_node) {
                stack_push(stack, &curr_node->id);
                curr_node = curr_node->next;
            }
        }
    }
}

int main()
{
    freopen("dfs.in", "r", stdin);
    freopen("dfs.out", "w", stdout);

    int i, N, M;
    scanf("%d %d", &N, &M);

    struct node **adj_list = calloc(N+1, sizeof(struct node*));
    assert(adj_list);

    for (i = 1; i <= M; ++i) {
        int x, y;
        scanf("%d %d", &x, &y);

        add_node(adj_list, x, y);
        add_node(adj_list, y, x);
    }

    int *visited_nodes = calloc(N+1, sizeof(int));
    int count = 0;
    for (i = 1; i <= N; ++i)
        if (!visited_nodes[i]) {
            ++count;
            dfs_iter(i, visited_nodes, adj_list, N);
        }

    printf("%d\n", count);

    // Free memory
    for (i = 1; i <= N; ++i)
        free_list(&adj_list[i]);

    free(adj_list);
    free(visited_nodes);

    return 0;
}