Pagini recente » Cod sursa (job #2183613) | Cod sursa (job #3253464) | Cod sursa (job #1853887) | Cod sursa (job #222587) | Cod sursa (job #1132364)
#include<cstdio>
#include<vector>
using namespace std;
const int NMAX = 100000+5;
const int MMAX = 200000+5;
void Read(),Solve(),Print();
int N,M,Top,OkSol;
vector<int> V[2*NMAX]; // graful implicatiilor
#define V (V+NMAX)
vector<int> W[2*NMAX]; // graful transpus al implicatiilor
#define W (W+NMAX)
bool Viz[2*NMAX];
#define Viz (Viz+NMAX)
int TSort[2*NMAX];
int Comp[2*NMAX]; // Comp[i] spune in ce componenta tare-conexa se afla nodul i
#define Comp (Comp+NMAX)
void SortareTopologica(int nod)
{
/* Sortare topologica a grafului initial */
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)
{
/* DFS pe graful transpus al grafului initial */
vector<int>::iterator it;
Viz[nod]=0;
for(it=W[nod].begin(); it!=W[nod].end(); it++)
{
if(!Viz[*it]) continue;
DFS(*it);
}
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=1; i<=2*N; i++)
{
x=TSort[i];
if(!Viz[x]) continue;
Top++;
DFS(x);
}
}
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);
W[y].push_back(-x);
W[x].push_back(-y);
}
}
void Solve()
{
int i;
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;
}
void Print()
{
int i;
if(!OkSol)
{
printf("-1\n");
return;
}
for(i=1; i<=N; i++)
printf("%d ",Comp[i]>Comp[-i]);
}