Pagini recente » Cod sursa (job #2344045) | Cod sursa (job #2358936) | Cod sursa (job #2830996) | Cod sursa (job #2678271) | Cod sursa (job #1111387)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream F("andrei.in");
ofstream G("andrei.out");
#define _it(x) vector<x>::iterator
const int N = 100010;
vector<int> v[N<<1],w[N<<1],stack;
bool mark[N<<1],ans[N<<1],no_sol;
int n,m;
int neg(int x)
{
return x > n ? x - n : x + n;
}
void dff(int x)
{
mark[x] = 1;
for (_it(int) y=v[x].begin();y!=v[x].end();++y)
if ( !mark[*y] )
dff(*y);
stack.push_back( x );
}
void dfs(int x)
{
if ( ans[x] ) no_sol = 1;
mark[x] = 1;
ans[neg(x)] = 1;
for (_it(int) y=w[x].begin();y!=w[x].end();++y)
if ( !mark[*y] )
dfs(*y);
}
void add(int x,int y)
{
v[neg(x)].push_back(y);
v[neg(y)].push_back(x);
w[x].push_back(neg(y));
w[y].push_back(neg(x));
}
int main()
{
F>>n>>m;
for (int i=1,x,y,t;i<=m;++i)
{
F>>x>>y>>t;
if ( t == 0 ) add(x,y);
if ( t == 1 ) add(neg(x),neg(y));
if ( t == 2 ) add(x,neg(y)), add(neg(x),y);
}
for (int i=1;i<=2*n;++i)
if ( !mark[i] )
dff(i);
memset(mark,0,sizeof(mark));
for (;!stack.empty();stack.pop_back())
{
int x = stack.back();
if ( !mark[x] && !mark[neg(x)] )
dfs(x);
}
if ( no_sol )
G<<"-1\n";
else
{
for (int i=1;i<=n;++i)
G<<ans[i]<<' ';
G<<'\n';
}
}