Pagini recente » Cod sursa (job #2308304) | Cod sursa (job #484916) | Cod sursa (job #1456024) | Cod sursa (job #1101929) | Cod sursa (job #2500178)
#include <fstream>
#include <vector>
#include <cmath>
const int MAXN = 100000;
using namespace std;
ifstream fin( "2sat.in" );
ofstream fout( "2sat.out" );
int n, m;
int id_[2 * MAXN + 2], lastId, low_[2 * MAXN + 2], st[MAXN + 1], vf, state_[2 * MAXN + 2];
bool visited_[2 * MAXN + 2], inStack_[2 * MAXN + 2], ok = true;
vector<int> graph_[2 * MAXN + 2];
int* id = id_ + MAXN;
int* low = low_ + MAXN;
int* state = state_ + MAXN;
bool* visited = visited_ + MAXN;
bool* inStack = inStack_ + MAXN;
vector<int>* graph = graph_ + MAXN;
void dfs(int node){
visited[node] = true;
id[node] = low[node] = ++lastId;
st[++vf] = node;
inStack[node] = true;
for(auto it:graph[node]) {
if(!visited[it]) {
dfs(it);
low[node] = min(low[node], low[it]);
}
else if(inStack[it]) {
low[node] = min(low[node], low[it]);
}
}
if(id[node] == low[node]) {
int atr=0;
for(int i=vf; i > 0 && st[i+1] != node && ok; i--)
if(state[st[i]] != 0) {
if(atr == 0)
atr = state[st[i]];
else if(atr != state[st[i]])
ok = false;
}
else if(state[-st[i]] != 0) {
if(atr == 0)
atr = state[-st[i]];
else if(atr != state[-st[i]])
ok = false;
}
if(ok) {
if(atr == 0)
atr = 1;
while(vf > 0 && st[vf+1] != node) {
state[st[vf]] = atr;
state[-st[vf]] = -atr;
vf--;
}
}
}
}
int main()
{
fin>>n>>m;
for(int i=1; i<=m; i++) {
int x, y;
fin>>x>>y;
graph[-x].push_back(y);
graph[-y].push_back(x);
}
for(int i=-n; i<=n && ok; i++)
if(!visited[i]) {
dfs(i);
}
if(ok) {
for(int i=1; i<=n; i++) {
fout<<(state[i] == 1)<<" ";
}
} else {
fout<<"-1";
}
return 0;
}