Cod sursa(job #116817)

Utilizator filipbFilip Cristian Buruiana filipb Data 19 decembrie 2007 17:39:40
Problema Party Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>
#include <string.h>
#include <vector>

using namespace std;

#define get(var) (var > 0) ? (x[var]) : (!x[-var])
#define set(var) (var > 0) ? (x[var] = 1) : (x[-var] = 0)

int N, M, P[1005][2], x[1005];
int q[105], ql, qr, uz[105];
vector<int> G[105];

int check(int prop)
{
    int v1 = get(P[prop][0]), v2 = get(P[prop][1]);
    
    if (v1 == -1 && !v2)
    {
        set(P[prop][0]);
        q[++ql] = P[prop][0];
    }
    else if (!v1 && v2 == -1)
    {
        set(P[prop][1]);
        q[++ql] = P[prop][1];
    }
    else if (v1 == -1 && v2 == -1)
        return 1;
    else if (v1 != -1 && v2 != -1)
        return v1 || v2;

    return 1;
}

int BF(int x)
{
    int ql, qr, sz, ok = 1, el, i;

    for (q[ql=qr=0] = x, uz[x] = 1; qr <= ql && ok; qr++)    
    {
        el = q[qr];
        for (sz = G[el].size(), i = 0; i < sz && ok; i++)
            ok = check(G[el][i]);
    }

    for (i = 0; i <= ql; i++)
        uz[q[i]] = 0,
        q[i] = 0;

    return ok;
}

int main(void)
{
    int i, j, u, v, t;
    
    freopen("party.in", "r", stdin);
    freopen("party.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for (i = 1; i <= M; i++)
    {
        scanf("%d %d %d", &u, &v, &t);
        G[u].push_back(i);
        G[v].push_back(i);
        P[i][0] = u; P[i][1] = v;
        
        if (t == 1)
            P[i][1] *= (-1);
        else if (t == 2)
            P[i][0] *= (-1);
        else if (t == 3)
            P[i][0] *= (-1), P[i][1] *= (-1);
    }

    memset(x, -1, sizeof(x));
    for (i = 1; i <= N; i++)
        if (x[i] == -1)
        {
            x[i] = 0;
            j = BF(i);
            if (!j)
            {
                x[i] = 1;
                j = BF(i);
            }
        }

    for (j = 0, i = 1; i <= N; i++)
        j += x[i];
        
    printf("%d\n", j);
    for (i = 1; i <= N; i++)
        if (x[i])
            printf("%d\n", i);
        
    return 0;
}