Pagini recente » Cod sursa (job #1191136) | Cod sursa (job #2627973) | Cod sursa (job #612453) | Cod sursa (job #2580983) | Cod sursa (job #1131994)
#include<cstdio>
#include<vector>
#include<deque>
using namespace std;
const int NMAX = 100000+5;
const int MMAX = 200000+5;
void Read(),Solve(),Print();
int N,M,Top,NrCTC;
vector<int> V[2*NMAX];
#define V (V+NMAX)
bool Viz[2*NMAX];
#define Viz (Viz+NMAX)
int TSort[2*NMAX];
int Comp[2*NMAX];
#define Comp (Comp+NMAX)
int Opus[2*NMAX];
int Sol[NMAX],OkSol;
vector<int> CTC[2*NMAX];
vector<int> G[2*NMAX];
deque<int> Q;
void SortareTopologica(int nod)
{
vector<int>::iterator it;
Viz[nod]=1;
for(it=V[nod].begin(); it!=V[nod].end(); it++)
{
if(Viz[*it]) continue;
SortareTopologica(*it);
}
TSort[Top--]=nod;
}
void DFS(int nod)
{
vector<int>::iterator it;
Viz[nod]=0;
for(it=V[nod].begin(); it!=V[nod].end(); it++)
{
if(!Viz[*it]) continue;
DFS(*it);
}
CTC[Top].push_back(nod);
Comp[nod]=Top;
}
void ComponenteTareConexe()
{
int i,x;
Top=2*N;
for(i=-N; i<=N; i++)
{
if(!i) continue;
if(Viz[i]) continue;
SortareTopologica(i);
}
for(i=2*N; i>=1; i--)
{
x=TSort[i];
if(!Viz[x]) continue;
Top++;
DFS(x);
}
NrCTC=Top;
}
void ConstruiesteGraf()
{
/* Fiecare componenta tare-conexa se reduce
la un singur nod. */
int i,x;
vector<int>::iterator it,jt;
for(i=1; i<=NrCTC; i++)
{
for(it=CTC[i].begin(); it!=CTC[i].end(); it++)
{
x=*it;
for(jt=V[x].begin(); jt!=V[x].end(); jt++)
{
if(Comp[*jt]==i) continue;
G[i].push_back(Comp[*jt]);
}
}
}
for(i=1; i<=N; i++)
{
Opus[Comp[i]]=Comp[-i];
Opus[Comp[-i]]=Comp[i];
}
}
int main()
{
Read();
Solve();
Print();
return 0;
}
void Read()
{
int x,y;
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d%d",&N,&M);
for(; M; --M)
{
scanf("%d%d",&x,&y);
/* Construirea grafului de implicatii
x v y <=> (~x -> y) ^ (~y -> x) */
V[-x].push_back(y);
V[-y].push_back(x);
}
}
void Solve()
{
int i,x,cnt=0;
vector<int>::iterator it;
ComponenteTareConexe();
/* Daca exista doua noduri x si ~x in aceeasi
componenta tare-conexa, nu exista solutie.
Altfel, exista solutie. */
for(i=1; i<=N; i++)
if(Comp[i]==Comp[-i]) return;
OkSol=1;
ConstruiesteGraf();
for(i=1; i<=NrCTC; i++)
if(G[i].size()==0) Q.push_back(i);
while(!Q.empty())
{
x=Q.front();
Q.pop_front();
if(Viz[x]) continue;
for(it=CTC[x].begin(); it!=CTC[x].end(); it++)
{
if(*it < 0) Sol[-(*it)]=0;
else Sol[*it]=1;
}
Viz[x]=1;
Viz[Opus[x]]=1;
cnt=0;
for(i=1; i<=NrCTC; i++)
{
for(it=G[i].begin(); it!=G[i].end(); it++)
if(!Viz[*it]) cnt++;
if(cnt==0) Q.push_back(i);
}
}
}
void Print()
{
int i;
if(!OkSol)
{
printf("-1\n");
return;
}
for(i=1; i<=N; i++)
printf("%d ",Sol[i]);
}