Pagini recente » Cod sursa (job #1198036) | Cod sursa (job #1030605) | Cod sursa (job #1482132) | Cod sursa (job #2050782) | Cod sursa (job #2474289)
#include <iostream>
#include <vector>
#include <stack>
#include <fstream>
using namespace std;
long long n, m, l[400000], index[400000], br, br1, vKomp[400000];
vector <int> sused[400000], comp[400000];
bool inStack[400000], otg[400000], imameOtg[400000], stop=false;
stack <int> st;
void dfs(int x){
inStack[x]=true;
st.push(x);
index[x]=br;
l[x]=br;
br++;
for(int i=0;i<sused[x].size();i++){
int nov=sused[x][i];
if(index[nov]==-1){
dfs(nov);
l[x]=min(l[nov], l[x]);
}else if(inStack[nov]){
l[x]=min(l[nov], l[x]);
}
}
if(l[x]==index[x]){
bool j=false;
while(!st.empty() and !j){
if(st.top()==x){
j=true;
}
comp[br1].push_back(st.top());
inStack[st.top()]=false;
st.pop();
}
br1++;
}
}
void napraviTakavaComp(bool dadeno, int nomer){
ofstream fileout;
fileout.open("2sat.out");
ifstream filein;
filein.open("2sat.in");
if(stop){
return;
}
for(int i=0;i<comp[nomer].size();i++){
if(imameOtg[comp[nomer][i]]){
if(otg[comp[nomer][i]]!=dadeno){
//cout<<"-1";
fileout<<"-1";
stop=true;
}
}else{
imameOtg[comp[nomer][i]]=true;
otg[comp[nomer][i]]=dadeno;
if(comp[nomer][i]<=200000){
if(!imameOtg[comp[nomer][i]+200000]){
imameOtg[comp[nomer][i]+200000]=true;
otg[comp[nomer][i]+200000]=!dadeno;
napraviTakavaComp(!dadeno, vKomp[comp[nomer][i]+200000]);
}else{
if(otg[comp[nomer][i]+200000]==otg[comp[nomer][i]]){
//cout<<"-1";
fileout<<"-1";
stop=true;
}
}
}else{
if(!imameOtg[comp[nomer][i]-200000]){
imameOtg[comp[nomer][i]-200000]=true;
otg[comp[nomer][i]-200000]=!dadeno;
napraviTakavaComp(!dadeno, vKomp[comp[nomer][i]-200000]);
}else{
if(otg[comp[nomer][i]-200000]==otg[comp[nomer][i]]){
//cout<<"-1";
fileout<<"-1";
stop=true;
}
}
}
}
}
}
int main(){
ofstream fileout;
fileout.open("2sat.out");
ifstream filein;
filein.open("2sat.in");
//cin>>n>>m;
filein>>n>>m;
for(int i=0;i<m;i++){
int x, y, minusX, minusY, X, Y;
//cin>>x>>y;
filein>>x>>y;
if(-x<0){
minusX=x+200000;
}else{
minusX=-x;
}
if(x<0){
X=-x+200000;
}else{
X=x;
}
if(-y<0){
minusY=y+200000;
}else{
minusY=-y;
}
if(y<0){
Y=-y+200000;
}else{
Y=y;
}
sused[minusX].push_back(Y);
sused[minusY].push_back(X);
}
for(int i=200001;i<=200000+n;i++){
index[i]=-1;
l[i]=-1;
}
for(int i=1;i<=n;i++){
index[i]=-1;
l[i]=-1;
}
for(int i=200001;i<=200000+n;i++){
if(index[i]==-1){
dfs(i);
}
}
for(int i=1;i<=n;i++){
if(index[i]==-1){
dfs(i);
}
}
for(int i=0;i<br1;i++){
for(int j=0;j<comp[i].size();j++){
vKomp[comp[i][j]]=i;
}
}
for(int i=0;i<br1;i++){
for(int j=0;j<comp[i].size();j++){
if(!imameOtg[comp[i][j]]){
imameOtg[comp[i][j]]=true;
otg[comp[i][j]]=true;
napraviTakavaComp(true, vKomp[comp[i][j]]);
if(stop){
return 0;
}
if(comp[i][j]<=200000){
imameOtg[comp[i][j]+200000]=true;
otg[comp[i][j]+200000]=false;
napraviTakavaComp(false, vKomp[comp[i][j]+200000]);
if(stop){
return 0;
}
}else{
imameOtg[comp[i][j]-200000]=true;
otg[comp[i][j]-200000]=false;
napraviTakavaComp(false, vKomp[comp[i][j]-200000]);
if(stop){
return 0;
}
}
}
}
}
for(int i=1;i<=n;i++){
//cout<<otg[i]<<" ";
fileout<<otg[i]<<" ";
}
return 0;
}