Pagini recente » Cod sursa (job #1489713) | Cod sursa (job #2713506) | Cod sursa (job #523960) | Cod sursa (job #2476325) | Cod sursa (job #676019)
Cod sursa(job #676019)
#include <cstdio>
#include <vector>
#include <cstring>
#define NMax 200005
using namespace std;
vector <int> G[NMax], GT[NMax];
int N, TSort[NMax], S[NMax];
bool V[NMax];
inline int Non (int X)
{
if (X>N)
{
return X-N;
}
return X+N;
}
inline void Add (int X, int Y)
{
G[Non (X)].push_back (Y);
GT[Y].push_back (Non (X));
G[Non (Y)].push_back (X);
GT[X].push_back (Non (Y));
}
inline void DFP (int X)
{
V[X]=true;
for (vector <int> :: iterator Y=G[X].begin (); Y!=G[X].end (); ++Y)
{
if (!V[*Y])
{
DFP (*Y);
}
}
TSort[+TSort[0]]=X;
}
inline void DFM (int X)
{
V[X]=true;
S[X]=1;
for (vector <int> :: iterator Y=GT[X].begin (); Y!=GT[X].end (); ++Y)
{
if (!V[*Y])
{
DFM (*Y);
}
}
}
void Kosaraju ()
{
for (int i=1; i<=2*N; ++i)
{
if (!V[i])
{
DFP (i);
}
}
memset (V, 0, sizeof (V));
for (int i=1; i<=2*N; ++i)
{
if (!V[TSort[i]] and !V[Non (TSort[i])])
{
DFM (TSort[i]);
}
}
}
void Read ()
{
freopen ("andrei.in", "r", stdin);
int M;
scanf ("%d %d", &N, &M);
for (; M>0; --M)
{
int X, Y, C;
scanf ("%d %d %d", &X, &Y, &C);
if (C==0)
{
Add (X, Y);
}
if (C==1)
{
Add (Non (X), Non (Y));
}
if (C==2)
{
Add (X, Non (Y));
Add (Non (X), Y);
}
}
}
void Print ()
{
freopen ("andrei.out", "w", stdout);
for (int i=1; i<=N; ++i)
{
printf ("%d ", S[i]);
}
printf ("\n");
}
int main()
{
Read ();
Kosaraju ();
Print ();
return 0;
}