#include #include #define SOUBOR_VSTUP "kontejnery.in" #define SOUBOR_VYSTUP "kontejnery.out" // Formát vstupu: // Na prvním řádku N a M oddělené mezerou udávající počet kontejnerů a doporučení // Následuje M řádků ve tvaru a_i b_i, kde každý řádek znamená, že kontejnery // s indexy a_i a b_i by neměly být ve stejných skladištích // Kontejnery jsou indexované od 1 // Formát výstupu: // N řádků obsahujících buď P, nebo L, tedy že i-tý kontejner by měl být umístěn // na pravoboku nebo na levoboku typedef struct tdoporuceni { int kontejner; struct tdoporuceni *dalsi; } tdoporuceni; int main(void) { FILE *vstup = fopen(SOUBOR_VSTUP, "r"); int N, M; fscanf(vstup, "%d %d", &N, &M); char kontejner[N+1]; tdoporuceni *doporuceni[N+1]; for (int i=1; i<=N; i++) { kontejner[i] = 'X'; // Zatím neznámé umístění doporuceni[i] = NULL; } // Přidáme si každé doporučení do seznamu k oběma kontejnerům, // abychom je pak mohli snadno procházet a počítat. for (int i=1; i<=M; i++) { int a, b; fscanf(vstup, "%d %d", &a, &b); tdoporuceni *noveA = malloc(sizeof(tdoporuceni)); tdoporuceni *noveB = malloc(sizeof(tdoporuceni)); noveA->kontejner = b; noveA->dalsi = doporuceni[a]; doporuceni[a] = noveA; noveB->kontejner = a; noveB->dalsi = doporuceni[b]; doporuceni[b] = noveB; } fclose(vstup); FILE *vystup = fopen(SOUBOR_VYSTUP, "w"); // Nyní kontejner po kontejneru rozhodneme, kam je umístit. for (int i=1; i<=N; i++) { int pocetL = 0; int pocetP = 0; tdoporuceni *aktivni = doporuceni[i]; while (aktivni != NULL) { if (kontejner[aktivni->kontejner] == 'L') pocetL++; if (kontejner[aktivni->kontejner] == 'P') pocetP++; aktivni = aktivni->dalsi; } if (pocetL>pocetP) kontejner[i] = 'P'; else kontejner[i] = 'L'; fprintf(vystup, "%c\n", kontejner[i]); } fclose(vystup); return 0; }