Pagini recente » Cod sursa (job #727542) | Cod sursa (job #452128) | Cod sursa (job #919162) | Cod sursa (job #1855437) | Cod sursa (job #555739)
Cod sursa(job #555739)
#include <algorithm>
#include <stdio.h>
#include <vector>
#define MAX 100010
#define pb push_back
#define mp make_pair
#define f first
#define s second
using namespace std;
int n, m;
vector <int> vctViz;
vector <pair <int, int> > vctDrum[MAX];
int sol[MAX], pf[MAX];
int merge2sat(int nod, int cul)
{
int ok = 1;
if (pf[nod] == -1)
vctViz.pb(nod);
if (pf[nod] != -1 && pf[nod] != cul)
return 0;
else if (pf[nod] == cul)
return 1;
pf[nod] = cul;
for (int i = 0; i < vctDrum[nod].size() && ok; i++)
{
if (vctDrum[nod][i].s == cul)
ok &= merge2sat(vctDrum[nod][i].f, cul ^ 1);
if (vctDrum[nod][i].s == 2)
ok &= merge2sat(vctDrum[nod][i].f, cul);
}
return ok;
}
int main()
{
freopen("andrei.in", "r", stdin);
freopen("andrei.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++)
{
int n1, n2, c;
scanf("%d %d %d", &n1, &n2, &c);
vctDrum[n1].pb(mp(n2, c));
vctDrum[n2].pb(mp(n1, c));
}
for (int i = 1; i <= n; i++)
{
pf[i] = -1;
sol[i] = -1;
}
for (int i = 1; i <= n; i++)
if (sol[i] == -1)
{
vctViz.clear();
if (merge2sat(i, 0))
{
for (int j = 0; j < vctViz.size(); j++)
sol[vctViz[j]] = pf[vctViz[j]];
}
else
{
for (int j = 0; j < vctViz.size(); j++)
pf[vctViz[j]] = -1;
vctViz.clear();
merge2sat(i, 1);
for (int j = 0; j < vctViz.size(); j++)
sol[vctViz[j]] = pf[vctViz[j]];
}
}
for (int i = 1; i <= n; i++)
printf("%d ", sol[i]);
fclose(stdin);
fclose(stdout);
return 0;
}