Cod sursa(job #1542571)

Utilizator dan.marculetFII MarculetDan dan.marculet Data 5 decembrie 2015 14:51:33
Problema 2SAT Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int n, m;
typedef vector<int> VEC[200001];
VEC a, b;
int v[200001];
struct
{
    int x[200001];
    int k;
}l;
void dfs(int i, int t, VEC &a)
{
    //cout << "start " << i << endl;
    int j;
    v[i] = t;
    for (j = 0; j<a[i].size(); j++)
        if (!v[a[i][j]])
            dfs(a[i][j], t, a);
    if (t == 1)
        l.x[l.k++] = i;
    //cout << "end " << i << endl;
}
void draw_arc(int x, int y, VEC &a)
{
    if (x<0)x = x*-1 + n;
    if (y<0)y = y*-1 + n;
    a[x].push_back(y);
}
int w[200001][2];
int main()
{
    fin >> n >> m;
    int j, i;
    int p = 0;
    while (m--)
    {
        fin >> i >> j;
        w[p][0] = i<0 ? (-i) + n : i;
        w[p++][1] = j < 0 ? (-j) + n : j;
        draw_arc(i*-1, j, a);
        draw_arc(j*-1, i, a);
    }
    for (j = 1; j <= n * 2; j++)
        if (!v[j])
            dfs(j, 1, a);
    for (i = 1; i <= n * 2; i++)
        for (j = 0; j<a[i].size(); j++)
            draw_arc(a[i][j], i, b);
    for (i = 0; i <= n * 2; i++)v[i] = 0;
    int t = 2;
    int k = 0;
    for (j = l.k - 1; j >= 0; j--)
        if (!v[l.x[j]])
        {
            k++;
            cout << l.x[j] << " ";
            if (k == 30) { cout << '\n'; k = 0; }
            dfs(l.x[j], t, b);
            t++;
        }
    cout << '\n';
    for (i = 1; i <= n * 2; i++)
        if ((i >= n + 1 && v[i] == v[i - n]) || (i <= n && v[i + n] == v[i]))
        {
            fout << -1;
            return 0;
        }
    int q[200001];
    for (i = 1; i <= 2 * n; i++)
        if (v[i] <= t / 2)
            q[i] = 0;
        else q[i] = 1;
        for (i = 1; i <= n * 2; i++)
            for (j = 0; j<a[i].size(); j++)
                if (q[i] == 1 && q[a[i][j]] == 0)
                {
                    cout << "AAA" << i << " " << a[i][j] << '\n';
                }
        for (i = 0; i<p; i++)
        {
            if (q[w[i][0]] == 1 || q[w[i][1]] == 1) continue;
            cout << "belea " << i << endl;
        }
        for (i = 1; i <= n; i++)
            fout << q[i] << " ";
        return 0;
}