#include #include #include #define MAX 100 typedef struct { int stupen; char *jmeno; } uzel; uzel score[MAX],score1[MAX]; /* 2x pole pro uložení vstupu */ int n; int cmp(const void *a, const void *b) /* porovnání pro quicksort */ { return (((uzel*)b)->stupen - ((uzel*)a)->stupen); } int test(uzel* pole, int t) /* t=indikátor výpisu */ { int i, l, stupen, left, right; uzel *k, tmp; /* pro každý vrchol setříděné posloupnosti */ for (i=0; i < n; i++) { stupen=(pole+i)->stupen; /* největší stupeň */ if (!stupen) return 1; /* graf v pořádku */ else { k=pole+i; for (l=1; l<=stupen; l++) { /* od násled. "stupen" vrcholů odečti hranu */ if (--((k+l)->stupen) < 0) return 0; /* podvod - došly vrcholy */ if (t) printf("spojeni %s - %s\n",k->jmeno, (k+l)->jmeno); } k=pole+i+stupen; left=right=0; /* teď dotřídíme stupně */ /* najdeme okraje */ while((k+right != pole+n-1) && ((k->stupen) == (k+right+1)->stupen-1)) right++; while(k->stupen == (k+left-1)->stupen) left--; /* převrátíme blok */ for (; left < right; left++, right--) { tmp.stupen=(k+left)->stupen; tmp.jmeno=(k+left)->jmeno; (k+left)->stupen=(k+right)->stupen; (k+left)->jmeno=(k+right)->jmeno; (k+right)->stupen=tmp.stupen; (k+right)->jmeno=tmp.jmeno; } (pole+i)->stupen=0; /* zrušíme vrchol */ } } return 1; } int main(void) { char jmeno[100]; int pom=0, konec=0, i; scanf("%d\n",&n); for (i=0;i= n) konec=1; /* stupeň nesmí být větší */ } if ((pom&1) || konec) /* už teď je jasný podvod */ { puts("Podvodnici!"); return 0; } qsort(score,n,sizeof(uzel),cmp); for(i=0; i