Pagini recente » Cod sursa (job #2811710) | Cod sursa (job #2304873) | Cod sursa (job #909279) | Cod sursa (job #1316276) | Cod sursa (job #2239798)
# include <fstream>
# include <vector>
# include <stack>
# define DIM 200010
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
stack<int> s,q;
vector<int> Lista[DIM];
int Marcat[DIM],low[DIM],niv[DIM],n,m,x,y,i,t;
int rv(int x){
if(x<=n)
return x+n;
else
return x-n;
}
void tarjan(int nc){
t++;
low[nc]=niv[nc]=t;
s.push(nc);
for(int i=0;i<Lista[nc].size();i++){
int nv=Lista[nc][i];
if(niv[nv]==0)
tarjan(nv);
if(Marcat[nv]==0)
low[nc]=max(low[nc],low[nv]);
}
if(low[nc]==niv[nc]){
int val=0;
while(s.top()!=nc){
val=max(val,Marcat[s.top()]);
q.push(s.top());
s.pop();
}
val=max(val,Marcat[s.top()]);
q.push(s.top());
s.pop();
if(val==0)
val=1;
while(!q.empty()){
Marcat[q.top()]=val;
Marcat[rv(q.top())]=3-val;
q.pop();
}
}
}
int main () {
fin>>n>>m;
for(i=1;i<=m;i++){
fin>>x>>y;
if(x<0)
x=-x+n;
if(y<0)
y=-y+n;
Lista[rv(x)].push_back(y);
Lista[rv(y)].push_back(x);
}
for(i=1;i<=2*n;i++)
if(niv[i]==0)
tarjan(i);
for(i=1;i<=n;i++)
fout<<Marcat[i]%2<<" ";
return 0;
}