Pagini recente » Cod sursa (job #2370729) | Cod sursa (job #1573361) | Cod sursa (job #2398879) | Cod sursa (job #1286068) | Cod sursa (job #2458950)
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
#include <stack>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int n,m;
vector<int> v[200005];
bool ins[200005];
bool vis[200005];
int disc[200005];
int low [200005];
int countt;
stack<int> s;
vector<int> comp[200005];
int compcount;
int indComp[200005];
int op[200005];
bool val[200005];
bool visC[200005];
bool exists=true;
void specDFS(int nod)
{
s.push(nod);
countt++;
disc[nod]=low[nod]=countt;
vis[nod]=true;
ins[nod]=true;
for(int i=0;i<v[nod].size();i++)
{
int currentNod=v[nod][i];
if(!vis[currentNod])
{
specDFS(currentNod);
low[nod]=std::min(low[nod],low[currentNod]);
}
else if(vis[currentNod] && ins[currentNod])
low[nod]=std::min(low[nod],disc[currentNod]);
}
if(low[nod]==disc[nod])
{
// cout<<nod-n<<"\n";
int tp= s.top();
do
{
tp=s.top();
comp[compcount].push_back(tp);
ins[tp]=false;
indComp[tp]=compcount;
int optp=-(tp-n)+n;
if(indComp[optp]!=-1 &&indComp[optp]==indComp[tp])
{
exists=false;
return;
}
else if(indComp[optp]!=-1)
{
op[optp]=indComp[tp];
op[tp]=indComp[optp];
}
s.pop();
}
while(tp!=nod);
compcount++;
}
}
int main()
{
fin>>n>>m;
for(int i=0;i<=2*n;i++)
{
low[i]=2*n+1;
indComp[i]=-1;
}
for(int i=0;i<m;i++)
{
int j,k;
fin>>j>>k;
v[-j+n].push_back(k+n);
v[-k+n].push_back(j+n);
}
for(int i=0;i<=2*n;i++)
{
if(i==n) continue;
if(vis[i]) continue;
specDFS(i);
}
if(!exists)
{
fout<<"-1";
return 0;
}
for(int i=compcount-1;i>=0;i--)
{
int first=comp[i][0];
if(visC[indComp[first]])continue;
for(unsigned int j=0;j<comp[i].size();j++)
{
int elem= comp[i][j];
if(elem<n)
val[-(elem-n)]=1;
else
val[elem-n]=0;
}
visC[indComp[first]]=true;
visC[op[first]]=true;
}
for(int i=1;i<=n;i++)
fout<<(int)val[i]<<" ";
}