Pagini recente » Cod sursa (job #1804695) | Cod sursa (job #2433097) | Cod sursa (job #2407863) | Cod sursa (job #2110901) | Cod sursa (job #1929351)
#include <bits/stdc++.h>
#define maxN 2*100005
using namespace std;
vector<int> v[maxN];
int scc[maxN],val[maxN];
int n,m,i,j,x,y;
int idx[maxN],low[maxN],curr;
int stk[maxN],top;
bool in_stk[maxN];
inline int opposite(int x)
{
if(x>n)
return x-n;
return x+n;
}
void tarjan(int nod)
{
idx[nod]=low[nod]=++curr;
stk[++top]=nod;
in_stk[nod]=true;
for(auto it:v[nod])
if(!idx[it]){
tarjan(it);
low[nod]=min(low[nod],low[it]);
}
else if(in_stk[it])
low[nod]=min(low[nod],idx[it]);
if(low[nod]==idx[nod])
{
int newn;
do{
newn=stk[top--];
in_stk[newn]=false;
if(!val[newn]){ /* assign values */
val[newn]=1;
val[opposite(newn)]=-1;
}
}while(newn!=nod);
}
}
int main()
{
freopen("andrei.in","r",stdin);
freopen("andrei.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++) /* building 2-SAT graph */
{
int col;
scanf("%d %d %d",&x,&y,&col);
if(col==0){
v[opposite(x)].push_back(y);
v[opposite(y)].push_back(x);
}
else if(col==1){
v[x].push_back(opposite(y));
v[y].push_back(opposite(x));
}
else{
v[x].push_back(opposite(y));
v[opposite(y)].push_back(x);
v[opposite(x)].push_back(y);
v[y].push_back(opposite(x));
}
}
for(i=1;i<=2*n;i++)
if(!idx[i])
tarjan(i);
for(i=1;i<=n;i++)
printf("%d ",(val[i]==1?1:0));
return 0;
}