Pagini recente » Cod sursa (job #1028866) | Cod sursa (job #1283493) | Cod sursa (job #1218346) | Cod sursa (job #1378334) | Cod sursa (job #3342609)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
using namespace std;
const int N=2e5+5;
vector<int> g[N],gt[N];
int n,m,v[N],nr;
vector<int> sol;
bitset<N> viz;
stack<int> q;
bool realizabil=1;
void dfs(int nod)
{
viz[nod]=1;
for(auto el:g[nod])
if(!viz[el])dfs(el);
q.push(nod);
}
void dfs_gt(int nod)
{
cout<<nod<<' '<<nr<<'\n';
viz[nod]=1;
v[nod]=nr;
for(auto el:gt[nod])
if(!viz[el])dfs_gt(el);
}
int main()
{
ifstream fin("2sat.in");
fin>>n>>m;
// a[i] => non a[i+n];
int i,j,x,y,nonx,nony;
bool nx,ny;
for(i=0; i<m; i++)
{
fin>>x>>y;
nx=ny=0;
if(x<0)
{
x=-x+n;
nonx=x-n;
nx=1;
}
else nonx=x+n;
if(y<0)
{
y=-y+n;
nony=y-n;
ny=1;
}
else nony=y+n;
g[nonx].push_back(y);
g[nony].push_back(x);
gt[y].push_back(nonx);
gt[x].push_back(nony);
}
for(i=1; i<=2*n; i++)
if(!viz[i])
dfs(i);
viz.reset();
while(!q.empty())
{
x=q.top();
q.pop();
if(viz[x])
continue;
nr++;
dfs_gt(x);
}
sol.resize(n+1);
for(i=1;i<=n;i++)
{
if(v[i]==v[i+n]){
realizabil=0;
goto AFIS;
}
}
AFIS:
ofstream fout("2sat.out");
if(realizabil)
for(i=1; i<=n; i++)fout<<sol[i]<<' ';
else fout<<-1;
fout.close();
return 0;
}