
#define MAX 50


typedef struct {
    int length;
    int val[MAX];
} List;

typedef struct {
    int n;
    List adj[MAX];
    List prosp[MAX];
    int taken[MAX];
} Graph;

void MakeGraph (Graph *g, int n)
{
    int i, j;
    
    g->n = n;
    for (i = 0; i < n; i++) {
	g->adj[i].length = 0;
	for (j = 0; j < n; j++) {
	    if (j != i) {
		g->adj[i].val[g->adj[i].length++] = j;
	    }
	}
    }
}


void PrintGraph (Graph *g)
{
    int i, j;
    
    printf ("Graph has %d vertices\n", g->n);
    for (i = 0; i < g->n; i++) {
	printf ("  %d: ", i);
	for (j = 0; j < g->adj[i].length; j++) {
	    printf (" %d", g->adj[i].val[j]);
	}
	printf ("\n");
    }
    printf ("\n");
}

void ListDel (List *l, int what)
{
    int i;
    for (i = 0; i < l->length; i++)
	if (l->val[i] == what) {
	    while (++i < l->length)
		l->val[i-1] = l->val[i];
	    l->length--;
	    return;
	}
    printf ("panic: %d not in list\n", what);
}

void DoMatch (Graph *g)
{
    int n = g->n;
    int m, i, j;
    
    bcopy (g->adj, g->prosp, sizeof(g->adj));
    bzero (g->taken, sizeof(g->taken));
    for (m = 0; m < n/2; m++) {
	int u, v, wn, w;
	int least = MAX;
	int leastnum = -1;
	for (i = 0; i < n; i++) {
	    if (g->prosp[i].length < least && !g->taken[i]) {
		least = g->prosp[i].length;
		leastnum = i;
	    }
	}
	u = leastnum;
	least = MAX;
	leastnum = -1;
	for (i = 0; i < g->prosp[u].length; i++) {
	    v = g->prosp[u].val[i];
	    if (g->prosp[v].length < least) {
		least = g->prosp[v].length;
		leastnum = v;
	    }
	}
	v = leastnum;
	printf ("   Play %d and %d\n", u, v);
	g->taken[u] = 1;
	g->taken[v] = 1;
	ListDel (&g->adj[u], v);
	ListDel (&g->adj[v], u);
	for (wn = 0; wn < g->prosp[u].length; wn++) {
	    w = g->prosp[u].val[wn];
	    if (!g->taken[w])
		ListDel (&g->prosp[w], u);
	}
	for (wn = 0; wn < g->prosp[v].length; wn++) {
	    w = g->prosp[v].val[wn];
	    if (!g->taken[w])
		ListDel (&g->prosp[w], v);
	}
    }
}
	
	
	    
    
	


main(argc, argv)
    int argc;
    char **argv;
{
    int n, day;
    Graph g;

    if (argc < 0) {
	printf ("gimme arg\n");
	exit(1);
    }
    n = atoi(argv[1]);
    if (n < 2) {
	printf ("bad num\n");
	exit(1);
    }
    printf ("Making graph\n");
    MakeGraph(&g, n);
    for (day = 1; day <= n - 1; day++) {
	printf ("Day %d:\n", day);
	PrintGraph (&g);
	DoMatch(&g);
    }
}



