Pagini recente » Cod sursa (job #2649014) | Cod sursa (job #1064590) | Cod sursa (job #1582651) | Cod sursa (job #1668805) | Cod sursa (job #1576471)
#include <iostream>//Foloseste Kosaraju
#include <fstream>//De ce unele teste pe care iau Gresit afiseaza doar 1 atunci cand eu gasesc o solutie?
#include <vector>
#include <stack>
#include <string.h>
#define NMAX 100005
using namespace std;
vector<int> Comp[NMAX*2+1],L,G[NMAX*2+1],Gt[NMAX*2+1];
vector< vector<int> > componentVector;
bool visited[NMAX*2],val[NMAX],solved,mark[NMAX*2];
int NrComp,N,M,component[NMAX*2];
#define G (G+NMAX)
#define Gt (Gt+NMAX)
#define component (component+NMAX)
#define visited (visited+NMAX)
void push(int x, int y)
{
G[x].push_back(y);
Gt[y].push_back(x);
}
void read()
{
scanf("%d%d", &N, &M);
int a,b,conva,convb,notconva,notconvb;
for(int i=1; i<=M; i++) // G: -N, ..., -4, -3, -2, -1, 1, 2, 3, 4, ..., N
{
scanf("%d%d", &a, &b);
push(-a,b);
push(-b,a);
}
}
void visit(int u)
{
if(visited[u])
return;
visited[u]=1;
for(int i=0; i<G[u].size(); ++i)
//for(int i=1; i<=G[u][0]; ++i)
visit(G[u][i]);
L.push_back(u);
}
void createComponent(int u,int componenta)
{
component[u]=componenta;
componentVector[componenta].push_back(u);
for(int i=0; i<Gt[u].size(); ++i)
{
int nod=Gt[u][i];
if(!component[nod])
createComponent(nod,componenta);
}
}
void afisare()
{
for(int i=N+1;i<=N*2;i++)
cout<<val[i]<<' ';
cout<<'\n';
}
void setVal (bool value, int x) {
if (x>0)
val[x] = value;
else
val[-x] = !value;
}
bool sat2()
{
short *compVal=new short[componentVector.size()];
memset(compVal,0,componentVector.size()*2);
for (int i = componentVector.size()-1; i>=1; i--)
{
if(compVal[i]==0){
compVal[i]=2;
for(int j=0;j<componentVector[i].size(); j++)
{
if(component[componentVector[i][j]]==component[-componentVector[i][j]])
return 0;
setVal (1, componentVector[i][j]);
}
int ni = component[-componentVector[i][0]];
compVal[ni]=1;
}
}
return 1;
}
int main()
{
freopen("2sat.in","rt",stdin);
freopen("2sat.out","wt",stdout);
read();
//sortare topologica Kosaraju
for(int u=1; u<=N; u++)
visit(u),
visit(-u);
/*for(int i=0;i<L.size();i++)
cout<<L[i]<<' ';
cout<<'\n';*/
//crearea componentelor conexe
componentVector.push_back(*new vector<int>);
while(!L.empty())
{
if(!component[L.back ()]) {
componentVector.push_back(*new vector<int>);
createComponent(L.back(),componentVector.size()-1);
}
L.pop_back();
}
/*for(int i=1;i<componentVector.size();i++)
{
for(int j=0;j<componentVector[i].size();j++)
cout<<componentVector[i][j]<<' ';
cout<<'\n';
}*/
if(sat2()){
for(int i=1;i<=N;i++)
cout<<val[i]<<' ';
cout<<'\n';
}else
cout<<"-1\n";
}