Раздел «Информация».MaxPares:

Max pares

#include <stdio.h>

#define M 500
#define D 500
#define MD 30

int d2m[D];
int m2d[M];
int nm;
int nd;
int ne;
int mdl[M][MD];
int mnd[M];
int pi[M];

typedef struct {
        int *data;
        int last;
        int first;
} queue_t;

queue_t *q;

queue_t *new_queue(int n) {
        queue_t *q = (queue_t*)malloc(sizeof(queue_t));
        q->first = q->last = 0;
        q->data = (int*) malloc(n * sizeof(int));
        //printf("new queue %p %p\n", q, q->data);
        return q;

}
void enqueue(queue_t *q, int x) {
        q->data[q->last++] = x;
}

int dequeue(queue_t *q, int *x) {
        if(q->last <= q->first)
                return 0;
        else {
                *x =q->data[q->first++];
                return 1;
        }
}

int reset_queue(queue_t* q) {
        printf("Reset queue %p %p\n", q, q->data);
        q->last = 0;
        q->first = 0;
}


int find_path();
int do_path(int m, int d);

int
main() {
        int i, d, m;
        scanf("%d%d", &nm, &nd);
        scanf("%d", &ne);

        for(i = 0 ; i < nd; i++) {
                d2m[i] = -1;
        }

        for(i = 0 ; i < nm; i++) {
                mnd[i] = 0;
                m2d[i] = -1;
        }

        q = new_queue(nm);
        for(i = 0 ; i < ne; i++) {
                int m, d;
                scanf("%d%d", &m, &d);
                //intf("girl %d for %d\n", mnd[m], m);
                mdl[m][ mnd[m]++ ] = d;
        }
        printf("Start iterating\n");
        do {
                reset_queue(q);
                printf("Next iteration: \n");
                for(m = 0 ; m < nm ; m++) {
                        if(m2d[m] == -1) {
                                enqueue(q, i);
                        }
                        pi[m] = -1;
                }
        } while( find_path());

        for(m = 0 ; m < nm ; m++) {
                if(m2d[m] != -1) {
                        printf("%d %d\n", m, m2d[m]);
                }
        }

        return 0;
}


int find_path() {
        int i, m;
        printf("Find path\n");
        while(dequeue(q, &m)) {
                for(i = 0 ; i< mnd[m] ; i++)
                {
                        int d = mdl[m][i];
                        if(d2m[d] != -1) {
                                do_path(d, m);
                                return 1;
                        } else {
                                pi[d2m[d]] = m;
                                enqueue(q, d2m[d]);
                        }
                }
        }
        return 0;
}

int do_path (int d, int m) {
        printf("Do path\n");
        do {
                int m_new = pi[m];
                int d_new = m2d[m];
                printf("%d = %d -", d, m);
                m2d[m] = d;
                d2m[d] = m;
                m = m_new;
                d = d_new;
        } while(m != -1);
}

CommonWebForm
Type: Другое
Stuff: Olimpic
Date:  
ID:  
Importance: Medium
Author:  
Summary: