Pagini recente » Cod sursa (job #2036068) | Cod sursa (job #1245167) | Cod sursa (job #1871940) | Cod sursa (job #1900209) | Cod sursa (job #1534626)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("andrei.in");
ofstream g("andrei.out");
int M,N;
const int NMAX = 200005;
vector <int> G[NMAX],GT[NMAX];
int O[NMAX],Solution[NMAX],K;
bool Use[NMAX];
inline int Node(int x)
{
if(x<0)
return N-x;
return x;
}
inline int Non(int x)
{
if(x<=N)
return x+N;
else
return x-N;
}
void fillGraph(int x,int y)
{
x=Node(x);
y=Node(y);
GT[x].push_back(Non(y));
GT[y].push_back(Non(x));
G[Non(x)].push_back(y);
G[Non(y)].push_back(x);
}
void Read()
{
int i;
f>>N>>M;
for(i=1;i<=M;i++)
{
int x,y,c;
f>>x>>y>>c;
if(c==0)
fillGraph(x,y);
if(c==1)
{
x=-x;
y=-y;
fillGraph(x,y);
}
if(c==2)
{
x=-x;
fillGraph(x,y);
x=-x;
y=-y;
fillGraph(x,y);
}
}
}
void DFP(int Nod)
{
Use[Nod]=1;
for(unsigned int i=0;i<G[Nod].size();i++)
{
int Vecin=G[Nod][i];
if(!Use[Vecin])
DFP(Vecin);
}
O[++K]=Nod;
}
void DFM(int Nod)
{
Use[Nod]=1;
if(Solution[Nod]==1)
{
Solution[0]=-1;
return;
}
Solution[Non(Nod)]=1;
for(unsigned int i=0;i<GT[Nod].size();i++)
{
int Vecin=GT[Nod][i];
if(!Use[Vecin])
DFM(Vecin);
}
}
void Kosaraju()
{
for(int i=1;i<=N*2;i++)
{
if(!Use[i])
DFP(i);
}
memset(Use,0,sizeof(Use));
for(int i=K;i>=1;i--)
{
if(!Use[O[i]] && !Use[Non(O[i])])
DFM(O[i]);
}
}
void Print()
{
int i;
if(Solution[0]==-1)
{
g<<-1<<"\n";
return;
}
for(i=1;i<=N;i++)
g<<Solution[i]<<" ";
g<<"\n";
}
int main()
{
Read();
Kosaraju();
Print();
return 0;
}