Pagini recente » Cod sursa (job #464887) | Cod sursa (job #1868275) | Cod sursa (job #2650392) | Cod sursa (job #1078781) | Cod sursa (job #2232416)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("2sat.in");
ofstream fout ("2sat.out");
int n, m;
bool WROOOOOOONG;
bool f[200005];
bool answer[200005];
stack <int> road;
vector <int> graph[200005];
vector <int> reversed_Graph[200005];
int flip (int node)
{
if ( node > n ) return node-n;
return node+n;
}
void resetFrequency ()
{
for ( int i = 0; i <= 2*n+5; ++i )
f[i] = 0;
}
void dfs (int node)
{
f[node] = 1;
for ( auto x:graph[node] )
if ( f[x] == 0 )
dfs(x);
road.push(node);
}
void reverseDfs (int node)
{
if ( answer[node] == 1 )
{
WROOOOOOONG = 1;
return;
}
f[node] = 1;
answer[flip(node)] = 1;
for ( auto x:reversed_Graph[node] )
if ( f[x] == 0 )
reverseDfs(x);
}
int main()
{
fin>>n>>m;
for ( int i = 1; i <= m; ++i )
{
int first_Node, second_Node;
fin>>first_Node>>second_Node;
first_Node += n;
second_Node += n;
graph[flip(first_Node)].push_back(second_Node);
graph[flip(second_Node)].push_back(first_Node);
reversed_Graph[second_Node].push_back(flip(first_Node));
reversed_Graph[first_Node].push_back(flip(second_Node));
}
for ( int i = 0; i <= 2*n; ++i )
if ( f[i] == 0 )
dfs(i);
resetFrequency();
int indx = 0;
while ( road.size() )
{
if ( f[road.top()] == 0 && f[flip(road.top())] == 0 )
reverseDfs(road.top());
road.pop();
}
if ( WROOOOOOONG == true )
fout<<"-1"<<'\n';
else
for ( int i = 0; i < n; ++i )
fout<<answer[i]<<" ";
}