Cod sursa(job #242527)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 11 ianuarie 2009 12:34:04
Problema Progresii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>

#define score 100
#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair

#define IN  "bazaconii.in"
#define OUT "bazaconii.out"
#define N_MAX 1<<14

typedef pair<int,int> pi;

int T,N,M;
bool solutie;
vector< pair<pi,ll> > V(N_MAX); 
vector< vector<int> > A(N_MAX);
bool viz[N_MAX],BIT[N_MAX][35];
ll S[N_MAX];

II void scan()
{	
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d",&T);
}

II void read()
{
	int x,y;
	ll cc;
	
	scanf("%d %d\n",&N,&M);
	FOR(i,1,M)
	{
		scanf("%d %d %lld\n",&x,&y,&cc);
		if(x>y)
			swap(x,y);
		V[i] = mp( mp(x,y),cc );
	}	
}

II void DF(int nod,int K,bool type)
{
	BIT[nod][K] = type;
	int l = A[nod].sz()-1;
	FOR(i,0,l)
	{
		int fiu = A[nod][i];
		if(!viz[fiu])
		{
			viz[fiu] = true;
			DF(fiu,K,!type);
		}	
	}
}

II void solve()
{
	CC(BIT);
	CC(S);
	solutie = true;
	
	for(int bit = 32;bit >= 1;--bit)
	{
		FOR(i,1,M)
		{
			ll val = V[i].s;
			int x = V[i].f.f;
			int y = V[i].f.s;
			if(val & (ll)(1<<(bit-1)) )
			{	
				A[x].pb(y);
				A[y].pb(x);
			}	
		}
		
		FOR(i,1,N)
			if(A[i].sz() )
			{
				viz[i] = true;
				DF(i,bit,false);
				break;
			}	
		
		FOR(i,1,N)
			A[i].resize(0);
		CC(viz);
	}
	
	FOR(i,1,N)
	FOR(j,1,32)
		if(BIT[i][j] == true)
			S[i] += 1<<(j-1);
		
	FOR(i,1,M)
	{
		ll val = V[i].s;
		int x = V[i].f.f;
		int y = V[i].f.s;
		
		if(val != (ll)(S[x] ^ S[y]) )
		{
			solutie = false;
			break;
		}
	}
	if(!solutie)
		printf("-1\n");
	else
	{
		FOR(i,1,N-1)
			printf("%lld ",S[i]);
		printf("%lld\n",S[N]);	
	}
}

int main()
{
	scan();
	for(++T;--T;)
	{
		read();
		solve();
	}	
	return 0;
}