Pagini recente » Istoria paginii runda/usu4/clasament | Cod sursa (job #2903859) | Cod sursa (job #2138340) | Cod sursa (job #1159891) | Cod sursa (job #1713655)
#include<cstdio>
#include<vector>
#define MAXN 100010
using namespace std;
vector<int> g[2*MAXN],gt[2*MAXN];
vector<int> order;
int n,seen[2*MAXN],which[2*MAXN],current=0;
int Not(int x){
if(x<=n)
return x+n;
return x-n;
}
void FirstDFS(int node){
int i;
seen[node]=1;
for(i=0;i<g[node].size();i++)
if(seen[g[node][i]]==0)
FirstDFS(g[node][i]);
order.push_back(node);
}
void SecondDFS(int node){
int i;
which[node]=current;
for(i=0;i<gt[node].size();i++)
if(which[gt[node][i]]==0)
SecondDFS(gt[node][i]);
}
int main(){
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
int m,i,a,b;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d",&a,&b);
if(a<0)
a=n-a;
if(b<0)
b=n-b;
g[a].push_back(Not(b));
g[b].push_back(Not(a));
gt[Not(a)].push_back(b);
gt[Not(b)].push_back(a);
}
for(i=1;i<=2*n;i++)
if(seen[i]==0)
FirstDFS(i);
for(i=2*n-1;i>=0;i--)
if(which[order[i]]==0){
current++;
SecondDFS(order[i]);
}
for(i=1;i<=n;i++)
if(which[i]==which[i+n]){
printf("-1");
return 0;
}
for(i=1;i<=n;i++)
if(which[i]>which[i+n])
printf("0 ");
else
printf("1 ");
return 0;
}