Cod sursa(job #744009)

Utilizator freak93Adrian Budau freak93 Data 6 mai 2012 22:57:11
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <cstdio> 
#include <vector>
#include <cassert>
#include <cstdlib>
#include <ctime>
#include <cstring>
#define x first
#define y second

using namespace std;

const int maxn = 100005;
const int CONST = 2000;

vector <pair<int, int> > R;
int x, y, i, j, n, m, t, v[maxn];
bool mark[maxn];

inline int abs(int x) {
    return x < 0 ? (-x) : x;
}

bool eval(pair<int , int> A) {

    bool val1 = v[abs(A.first)] , val2 = v[abs(A.second)];
    if(A.first < 0)
        val1 ^= 1;
    if(A.second < 0)
        val2 ^= 1;

    return (val1 | val2);
}

bool fail = true;

int main() {

    assert(freopen("2sat.in", "r", stdin) != NULL);
    assert(freopen("2sat.out", "w", stdout) != NULL);
    
    assert(scanf("%d %d",&n, &m) == 2);

    for (i = 1; i <= m; ++i) {
        assert(scanf("%d %d", &x, &y) == 2);
        R.push_back(make_pair(x , y));
    }

    srand(time(NULL));
    for (i = 1; i <= n; ++i)
        v[i] = rand() % 2;
        
    for (t = 1; t <= CONST; ++t) {
        fail = false;

        for (i = 1; i <= m && !fail; ++i)
            if (!eval(R[i - 1])) {
                
                fail = true;
                if (mark[abs(R[i].first)] && mark[abs(R[i].second)])
                    continue;

                if (mark[abs(R[i].first)]) {
                    v[abs(R[i].second)] ^= 1;
                    continue;
                }

                if (mark[abs(R[i].second)]) {
                    v[abs(R[i].first)] ^= 1;
                    continue;
                }

                int choice = rand() % 2;

                if(choice)
                    v[abs(R[i].first)] ^= 1,
                    mark[abs(R[i].first)] = true;
                else {
                    v[abs(R[i].second)] ^= 1;
                    mark[abs(R[i].second)] = true;
                }
                
                break;
            }
        
        memset(mark, false, sizeof(mark));

        if (!fail)
            break;
    }
    
    for (i = 1; i <= n; ++i)
        printf("%d ",v[i]);

    return 0;
}