Pagini recente » Cod sursa (job #196305) | Cod sursa (job #1222150) | Cod sursa (job #1555362) | Cod sursa (job #860722) | Cod sursa (job #801014)
Cod sursa(job #801014)
#include <fstream>
#include <vector>
using namespace std;
const char InFile[]="andrei.in";
const char OutFile[]="andrei.out";
const int MaxN=200111;
ifstream fin(InFile);
ofstream fout(OutFile);
int N,M,x,y,op,S[MaxN],SOL[MaxN];
char viz[MaxN];
vector<int> G[MaxN],GT[MaxN];
inline int NON(const int &x)
{
if(x>N)
{
return x-N;
}
return x+N;
}
inline void Add(const int &x, const int &y)
{
G[NON(x)].push_back(y);
G[NON(y)].push_back(x);
GT[y].push_back(NON(x));
GT[x].push_back(NON(y));
}
void DFP(int nod)
{
viz[nod]=1;
for(vector<int>::iterator it=G[nod].begin();it!=G[nod].end();++it)
{
if(!viz[*it])
{
DFP(*it);
}
}
S[++S[0]]=nod;
}
void DFM(int nod)
{
viz[nod]=0;
viz[NON(nod)]=0;
SOL[nod]=0;
SOL[NON(nod)]=1;
for(vector<int>::iterator it=GT[nod].begin();it!=GT[nod].end();++it)
{
if(viz[*it])
{
DFM(*it);
}
}
}
int main()
{
fin>>N>>M;
for(register int i=1;i<=M;++i)
{
fin>>x>>y>>op;
if(op==0)
{
Add(x,y);
}
else if(op==1)
{
Add(NON(x),NON(y));
}
else
{
Add(x,NON(y));
Add(NON(x),y);
}
}
fin.close();
for(register int i=1;i<=(N<<1);++i)
{
if(!viz[i])
{
DFP(i);
}
}
while(S[0])
{
int x=S[S[0]];
if(viz[x])
{
DFM(x);
}
--S[0];
}
for(register int i=1;i<=N;++i)
{
fout<<SOL[i]<<" ";
}
fout.close();
return 0;
}