Cod sursa(job #2040987)

Utilizator Coroian_DavidCoroian David Coroian_David Data 16 octombrie 2017 19:18:22
Problema Balanta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <bits/stdc++.h>

#define MAX_N 1024
#define MAX_M 1024

using namespace std;

FILE *f, *g;

int n, m;

///-1 nesigur
///1 suspect
///0 curat
char greu[MAX_N + 1];
char usor[MAX_N + 1];

int a[MAX_N + 1];
int b[MAX_N + 1];

bool ap[2][MAX_N + 1][MAX_N + 1];
int rz[MAX_M + 1];


void doGreu(int a[], int b[], int k)
{
    int i;
    for(i = 1; i <= k; i ++)
    {
        if(greu[a[i]] != 0)
            greu[a[i]] = 1;

        if(usor[b[i]] != 0)
            usor[b[i]] = 1;
    }
}

void readFile()
{
    f = fopen("balanta.in", "r");

    fscanf(f, "%d%d", &n, &m);

    int i;
    for(i = 1; i <= n; i ++)
        greu[i] = usor[i] = -1;

    int k;
    for(i = 1; i <= m; i ++)
    {
        fscanf(f, "%d", &k);

        int j;
        for(j = 1; j <= k; j ++)
            fscanf(f, "%d", &a[j]);

        for(j = 1; j <= k; j ++)
            fscanf(f, "%d", &b[j]);

        for(j = 1; j <= k; j ++)
        {
            //cout << "BAGA " << j << " " << a[j] << " " << b[j] << "\n";

            ap[0][i][a[j]] = 1;
            ap[1][i][b[j]] = 1;
        }

        int rez;
        fscanf(f, "%d", &rez);

        rz[i] = rez;

        if(rez == 0)
        {
            for(j = 1; j <= k; j ++)
            {
                usor[a[j]] = usor[b[j]] = 0;
                greu[a[j]] = greu[b[j]] = 0;
            }
        }

        if(rez == 1)
            doGreu(a, b, k);

        if(rez == 2)
            doGreu(b, a, k);
    }

    fclose(f);
}

int rez;

bool verifU(int i, int rez)
{
    if(rez == 0)
        return 0;

    int j;
    for(j = 1; j <= m; j ++)
    {
        if(ap[0][j][i] || ap[1][j][i])
        {
            if(rz[j] == 0)
                return 0;

            if(rz[j] == 1 && ap[0][j][i] == 1)
                return 0;

            if(rz[j] == 2 && ap[1][j][i] == 1)
                return 0;
        }

        else
            if(rz[j] != 0)
                return 0;
    }

    return 1;
}

bool verifG(int i, int rez)
{
    if(rez == 0)
        return 0;

    int j;
    for(j = 1; j <= m; j ++)
    {/*
            if(i == 4)
            {
                cout << j << " " << rz[j] << " " << ap[0][j][i] << " " << ap[1][j][i] << "\n";
            }*/

        if(ap[0][j][i] || ap[1][j][i])
        {/*
            if(i == 4)
            {
                cout << j << " " << rz[j] << " " << ap[0][j][i] << " " << ap[1][j][i] << "\n";
            }*/

            if(rz[j] == 0)
                return 0;

            if(rz[j] == 2 && ap[0][j][i] == 1)
                return 0;

            if(rz[j] == 1 && ap[1][j][i] == 1)
                return 0;
        }

        else
            if(rz[j] != 0)
                return 0;
    }

    return 1;
}

void solve()
{
    int aps = 0;
    int i;
    for(i = 1; i <= n; i ++)
    {
        if(verifU(i, usor[i]) == 1 || verifG(i, greu[i]) == 1)
        {
            aps ++;

         //   cout << i << " " << (int)greu[i] << " " << (int)usor[i] << " \n";

            rez = i;
        }
    }

    if(aps != 1)
        rez = 0;
}

void printFile()
{
    g = fopen("balanta.out", "w");

    fprintf(g, "%d\n", rez);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}