Pagini recente » Cod sursa (job #1044123) | Cod sursa (job #3181828) | Cod sursa (job #2144162) | Cod sursa (job #2938453) | Cod sursa (job #2223362)
#include <fstream>
#include <vector>
#define VAL 200005
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int N, M, K, i, j, k, Cneg[VAL];
int A, B, neg[VAL], comp[VAL];
int st[VAL], top, CValue[VAL];
int SortTOP[VAL], NR, grad[VAL];
bool ok[VAL];
vector <int> G[VAL], Ginv[VAL], CG[VAL];
vector <int> :: iterator it;
void visit(int nod)
{
vector <int> :: iterator it;
ok[nod]=true;
for (it=G[nod].begin(); it!=G[nod].end(); it++)
if (ok[*it]==false)
visit(*it);
st[++top]=nod;
}
void Assign_Node(int nod)
{
vector <int> :: iterator it;
comp[nod]=K;
for (it=Ginv[nod].begin(); it!=Ginv[nod].end(); it++)
if (comp[*it]==0)
Assign_Node(*it);
}
int main()
{
fin >> N >> M;
for (i=1; i<=2*N; i++)
{
if (i<=N)
neg[i]=i+N;
else
neg[i]=i-N;
}
for (i=1; i<=M; i++)
{
fin >> A >> B;
if (A<0)
A=N-A;
if (B<0)
B=N-B;
G[neg[A]].push_back(B);
G[neg[B]].push_back(A);
Ginv[B].push_back(neg[A]);
Ginv[A].push_back(neg[B]);
}
for (i=1; i<=2*N; i++)
if (ok[i]==false)
visit(i);
while (top>0)
{
if (comp[st[top]]==0)
{
K++;
Assign_Node(st[top]);
}
top--;
}
for (i=1; i<=2*N; i++)
{
if (comp[i]==comp[neg[i]])
{
fout << "-1\n";
fin.close();
fout.close();
return 0;
}
Cneg[comp[i]]=comp[neg[i]];
for (it=G[i].begin(); it!=G[i].end(); it++)
{
if (comp[i]!=comp[*it])
{
grad[comp[*it]]++;
CG[comp[i]].push_back(comp[*it]);
}
}
}
for (i=1; i<=K; i++)
{
CValue[i]=-1;
if (grad[i]==0)
SortTOP[++NR]=i;
}
for (i=1; i<=K; i++)
{
A=SortTOP[i];
for (it=CG[A].begin(); it!=CG[A].end(); it++)
{
grad[*it]--;
if (grad[*it]==0)
SortTOP[++NR]=*it;
}
}
for (i=1; i<=NR; i++)
{
if (CValue[SortTOP[i]]==-1)
{
CValue[SortTOP[i]]=0;
CValue[Cneg[SortTOP[i]]]=1;
}
}
for (i=1; i<=N; i++)
fout << CValue[comp[i]] << " ";
fin.close();
fout.close();
return 0;
}