Pagini recente » Cod sursa (job #1292176) | Cod sursa (job #2931650) | Cod sursa (job #1335714) | Cod sursa (job #1141714) | Cod sursa (job #1254544)
#include<cstdio>
#include<vector>
using namespace std;
int M;
class SAT
{
public:
int n_Q, N, ap[200009], sol[100009], Q[200009];
vector < int > v[200009], h[200009];
int cod (int X)
{
if (X>=0) return X;
return N - X;
}
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));
h[cod(Y)].push_back(cod(X));
}
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)
{
sol[opus (nod)] = 1;
ap[nod] = 0;
for (vector < int > :: iterator it = h[nod].begin(); it != h[nod].end(); it++)
if (ap[*it] == 1)
dfp (*it);
}
void solve ()
{
for (int i=1; i<=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 (i);
}
}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;
}