aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
blob: c5bcb04d2d986b30e6467d7f05fd6f21eb824ffb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
#include <stdlib.h>
#include "cover.h"

int main(int argc, char* argv[]) {
    FILE* file = fopen(argv[1], "r");
    int n_sets, n_elements = 0;
    int current_element = 0;
    bucket *tail, *head = NULL;
    fscanf(file, "%d %d", &n_sets, &n_elements);
    parent** parents = malloc(n_elements*sizeof(parent*));
    for (int element_id = 0; element_id < n_elements; element_id++) {
        parents[element_id] = NULL;
    }

    for(int current_set = 0; current_set < n_sets; current_set++) {
        fscanf(file, "%d", &n_elements);
        set* s = new_set(current_set);
        bucket* current_bucket = tail;
        int j;
        for(j = 0; j < n_elements; j++) {
            fscanf(file, "%d", &current_element);
            element* el = insert_element(s, current_element);
            insert_parent(parents, el);
            if (current_bucket && current_bucket->size < (j + 1)) {
               current_bucket = current_bucket->next;
            }
        }
        if (!current_bucket) { // TODO: unify this, with attach_set
            bucket* b = new_bucket(s, j);
            b->prev = head;
            if (head) {
                head->next = b;
                head = b;
            } else {
                head = tail = b;
            }
        } else if (current_bucket->size == j) {
            insert_set(s, current_bucket);
        } else if (current_bucket->size > j) {
            bucket* b =  new_bucket(s, j);
            b->next = current_bucket;
            b->prev = current_bucket->prev;
            current_bucket->prev = b;
            if (!b->prev) {
                tail = b;
            }
        }
    }
    greedy(head, parents);
    return 0;
}