Pagini recente » Cod sursa (job #1121601) | Cod sursa (job #3170188) | Cod sursa (job #2648878) | Cod sursa (job #2350839) | Cod sursa (job #789148)
Cod sursa(job #789148)
#include<fstream>
#include<vector>
using namespace std;
int n,m,sol[200100];
vector <int> G[200100],GT[200100];
int postordine[200100],nr;
bool viz[200100],solutie=true;
inline int Non(int x)
{
if(x<=n)
return x+n;
return x-n;
}
inline void Citire()
{
int i,x,y;
ifstream fin("2sat.in");
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
if(x<0)
x=n+(-x);
if(y<0)
y=n+(-y);
G[Non(x)].push_back(y);
G[Non(y)].push_back(x);
GT[y].push_back(Non(x));
GT[x].push_back(Non(y));
}
fin.close();
}
inline void DFS(int x)
{
viz[x]=true;
vector <int>::iterator it;
for(it=G[x].begin();it!=G[x].end();it++)
if(!viz[*it])
DFS(*it);
postordine[++nr]=x;
}
inline void DFST(int x)
{
if(sol[x]==1)
{
solutie=false;
return;
}
viz[x]=false;
sol[Non(x)]=1;
vector <int>::iterator it;
for(it=GT[x].begin();it!=GT[x].end();it++)
if(viz[*it])
DFST(*it);
}
inline void Rezolvare()
{
int i;
for(i=1;i<=2*n;i++)
if(!viz[i])
DFS(i);
for(i=2*n;i>0;i--)
if(viz[postordine[i]] && viz[Non(postordine[i])])
DFST(postordine[i]);
}
inline void Afisare()
{
int i;
ofstream fout("2sat.out");
if(!solutie)
fout<<"-1\n";
else
{
for(i=1;i<=n;i++)
fout<<sol[i]<<' ';
fout<<"\n";
}
fout.close();
}
int main()
{
Citire();
Rezolvare();
Afisare();
return 0;
}