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);
}