Pagini recente » Monitorul de evaluare | Cod sursa (job #2570904) | Monitorul de evaluare | Cod sursa (job #2796993) | Cod sursa (job #3348436)
#include <bits/stdc++.h>
using namespace std;
ifstream f("andrei.in");
ofstream g("andrei.out");
int ctc[200009];
vector <int> v[200009], vt[200009];
int lin[200009], n, cnt=0, curr=0;
bitset <200009> viz;
int neg (int & nod)
{
if (nod>n)
return nod-n;
return nod+n;
}
void add (int x, int y)
{
v[x].push_back(y);
vt[y].push_back(x);
}
void imposibil (int x, int y)
{
int ngx, ngy;
if (x<=n)
ngx=x+n;
else ngx=x-n;
if (y>n)
ngy=y-n;
else ngy=y+n;
add (x, ngy);
add (y, ngx);
}
void dfs (int nod)
{
viz[nod]=1;
for (auto y:v[nod])
if (!viz[y])
dfs (y);
lin[++cnt]=nod;
}
void dfst (int nod)
{
viz[nod]=1;
ctc[nod]=curr;
for (auto y:vt[nod])
if (!viz[y])
dfst (y);
}
signed main ()
{
f >> n;
int m;
f >> m;
while (m--)
{
int a, b, c;
f >> a >> b >> c;
if (c==0)
imposibil (a, b);
else if (c==1)
imposibil (neg(a), neg(b));
else
{
imposibil (a, neg(b));
imposibil (b, neg(a));
}
}
for (int i=1; i<=2*n; i++)
{
if (!viz[i])
dfs (i);
}
for (int i=1; i<=2*n; i++)
viz[i]=0;
for (int i=2*n; i>=1; i--)
{
if (!viz[lin[i]])
curr++, dfst (lin[i]);
}
for (int i=1; i<=n; i++)
if (ctc[i]==ctc[i+n])
{
g << -1;
return 0;
}
for (int i=1; i<=n; i++)
{
if (ctc[i]<ctc[i+n])
g << 1 <<' ';
else
g << 0 <<' ';
}
}