Pagini recente » Cod sursa (job #3040455) | Cod sursa (job #538877) | Cod sursa (job #746827) | Cod sursa (job #2507232) | Cod sursa (job #1945938)
#include <bits/stdc++.h>
#define maxN 200005
using namespace std;
FILE *fin = freopen("andrei.in", "r", stdin);
FILE *fout = freopen("andrei.out", "w", stdout);
/* ============== */
int n, m;
/* ============== */
vector < int > V[maxN], T[maxN];
bool vis[maxN];
int ts[maxN];
/* ============== */
int ans;
bool val[maxN];
int Not(int x)
{
if (x <= n)
return x + n;
return x - n;
}
void addEdge(int x, int y)
{
V[Not(x)].push_back(y);
T[y].push_back(Not(x));
V[Not(y)].push_back(x);
T[x].push_back(Not(y));
}
void dfs(int x)
{
vis[x] = 1;
for (int nod : V[x])
if (!vis[nod])
dfs(nod);
ts[++ ts[0]] = x;
}
void dfsT(int x)
{
int nod;
vis[x] = 0;
if (val[x])
{
ans = 0;
return ;
}
val[Not(x)] = 1;
for (int nod : T[x])
if (vis[nod])
dfsT(nod);
}
void Ctc2Sat()
{
ans = 1;
for (int i = 1; i <= 2 * n; ++ i)
if (!vis[i])
dfs(i);
for (int i = ts[0]; i > 0; -- i)
if (vis[ts[i]] && vis[Not(ts[i])])
dfsT(ts[i]);
}
int main()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++ i)
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
if (!z)
addEdge(x, y);
else if (z == 1)
addEdge(Not(x), Not(y));
else
{
addEdge(Not(x), y);
addEdge(x, Not(y));
}
}
Ctc2Sat();
for (int i = 1; i <= n; ++ i)
printf("%d ", val[i]);
return 0;
}