Pagini recente » Cod sursa (job #2255709) | Cod sursa (job #3137843) | Cod sursa (job #1269642) | Cod sursa (job #1722291) | Cod sursa (job #1254548)
#include<cstdio>
#include<vector>
using namespace std;
int M;
class SAT
{
public:
int n_Q, n_componente, N, sol[200009], ap[200009], Q[200009];
vector < int > v[200009], h[200009], comp[200009];
int cod (int v)
{
if (v < 0) return N - v;
return v;
}
int opus (int x)
{
if (x<=N) return N + x;
return x - N;
}
void Add_Implication (int x, int y)
{
v [ cod ( x ) ] . push_back ( cod ( y ) );////graf normal
h [ cod ( y ) ] . push_back ( cod ( x ) );////graf transpus
}
void Add_Clauza (int x, int y)
{
Add_Implication (-x, y);
Add_Implication (-y, x);
}
void dfs (int nod)
{
ap[nod] = 1;
for (vector < int > :: iterator it = v[nod].begin(); it != v[nod].end(); it++)
if (ap[*it] == 0)
dfs (*it);
Q[++n_Q] = nod;
}
void dfp (int nod)
{
if (sol[nod])
{
sol[0] = -1;
return ;
}
ap[nod] = 0;
sol[opus(nod)] = 1;
for (vector < int > :: iterator it = h[nod].begin(); it != h[nod].end(); it++)
if (ap[*it] == 1)
dfp (*it);
}
int solve ()
{
for (int i=1; i<=2*N; i++)
if (ap[i] == 0)
dfs (i);
for (int i=n_Q; i>=1; i--)
if (ap[Q[i]] && ap[opus(Q[i])])
dfp (Q[i]);
return sol[0];
}
}sistem;
int main()
{
freopen ("andrei.in", "r", stdin);
freopen ("andrei.out", "w", stdout);
scanf ("%d %d", &sistem.N, &M);
for (int i=1; i<=M; i++)
{
int A, B, C;
scanf ("%d %d %d", &A, &B, &C);
if (C == 0) sistem.Add_Clauza (A, B);
else
if (C == 1) sistem.Add_Clauza (-A, -B);
else
{
sistem.Add_Clauza (-A, B);
sistem.Add_Clauza (-B, A);
}
}
sistem.solve();
for (int i=1; i<=sistem.N; i++)
printf ("%d ", sistem.sol[i]);
printf ("\n");
return 0;
}