Pagini recente » Cod sursa (job #2088838) | Cod sursa (job #1254689) | Cod sursa (job #2211438) | Cod sursa (job #2029547) | Cod sursa (job #469249)
Cod sursa(job #469249)
//Type: 2SAT
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
#define pb push_back
#define sz size()
#define N 200010
#define FORE(it,v) for (typeof(v.begin()) it=v.begin();it!=v.end();it++)
int n,m,a,b,c,num,com[N],res[N];
vector<int>g[N],g2[N];
bool used[N];
inline int neg(int a){
if (a<=n) return a+n;
return a-n;
}
void add(int a,int b){
g[neg(a)].pb(b);
g[neg(b)].pb(a);
g2[a].pb(neg(b));
g2[b].pb(neg(a));
}
void dfs(int x){
used[x]=1;
FORE(it,g[x]){
if (used[*it]) continue;
dfs(*it);
}
com[num++]=x;
}
void dfs2(int x){
used[x]=1;
res[x]=0;
res[neg(x)]=1;
FORE(it,g2[x]){
if (used[*it]) continue;
dfs2(*it);
}
}
void solve(){
num=0;
for (int i=1;i<=2*n;i++){
if (used[i]) continue;
dfs(i);
}
memset(used,0,sizeof(used));
for (int i=0;i<num;i++){
if (used[com[i]] || used[neg(com[i])]) continue;
dfs2(com[i]);
}
}
void output(){
bool print_space=0;
for (int i=1;i<=n;i++){
if (print_space) printf(" ");
print_space=1;
printf("%d",res[i]);
}
printf("\n");
}
void open(){
freopen("andrei.in","r",stdin);
freopen("andrei.out","w",stdout);
}
int main(){
open();
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
if (c==0){
add(a,b);
continue;
}
if (c==1){
add(neg(a),neg(b));
continue;
}
add(a,neg(b));
add(neg(a),b);
}
solve();
output();
//system("pause");
return 0;
}