Pagini recente » Diferente pentru home intre reviziile 413 si 412 | Cod sursa (job #2030751) | Cod sursa (job #1255914) | Cod sursa (job #1770525) | Cod sursa (job #473476)
Cod sursa(job #473476)
#include <algorithm>
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <bitset>
#include <deque>
#include <fstream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef bool int01;
typedef char cha08;
typedef short int int16;
typedef int int32;
typedef float rea32;
typedef long long int int64;
typedef double rea64;
const cha08 Input[] = "andrei.in";
const cha08 Output[] = "andrei.out";
const int32 Dim = 100001;
int01 viz[Dim];
int32 N, M;
int32 f[Dim];
vector < pair <int32, int32> > v[Dim];
int01 Check( int32 nod, int32 mul ) {
vector < pair <int32, int32> > :: iterator it;
viz[nod] = true;
for( it = v[nod].begin(); it != v[nod].end(); ++it )
if( viz[it->first] == false ) {
if( mul == 1 ) {
if( it->second == 0 && !f[it->first] )
Check( it->first, 2 );
else if( it->second == 0 && f[it->first] == 1 )
return 0;
// if( it->second == 1 )
// continue;
if( it->second == 2 && !f[it->first] )
Check( it->first, 1 );
else if( it->second == 2 && f[it->first] == 2 )
return 0;
}
else if( mul == 2 ) {
// if( it->second == 0 )
// continue;
if( it->second == 1 && !f[it->first] )
Check( it->first, 1 );
else if( it->second == 1 && f[it->first] == 2 )
return 0;
if( it->second == 2 && !f[it->first] )
Check( it->first, 2 );
else if( it->second == 2 && f[it->first] == 1 )
return 0;
}
}
return 1;
}
void DF( int32 nod ) {
vector < pair <int32, int32> > :: iterator it;
for( it = v[nod].begin(); it != v[nod].end(); ++it )
if( f[nod] == 1 ) {
if( it->second == 0 && !f[it->first] ) {
f[it->first] = 2;
DF( it->first );
}
// if( it->second == 1 )
// continue;
if( it->second == 2 && !f[it->first] ) {
f[it->first] = 1;
DF( it->first );
}
}
else if( f[nod] == 2 ) {
// if( it->second == 0 )
// continue;
if( it->second == 1 && !f[it->first] ) {
f[it->first] = 1;
DF( it->first );
}
if( it->second == 2 && !f[it->first] ) {
f[it->first] = 2;
DF( it->first );
}
}
}
int32 main() {
ifstream fin( Input );
ofstream fout( Output );
int32 i, c, x, y;
fin >> N >> M;
while( M -- ) {
fin >> x >> y >> c;
v[x].push_back( make_pair( y, c ) );
v[y].push_back( make_pair( x, c ) );
}
for( i = 1; i <= N; ++i )
if( !f[i] ) {
memset( viz, false, sizeof( viz ) );
f[i] = (Check( i, 1 ) ? 1 : 2);
DF( i );
}
for( i = 1; i <= N; ++i )
fout << f[i] - 1 << " ";
fin.close();
fout.close();
return 0;
}