Pagini recente » Cod sursa (job #2443387) | Cod sursa (job #2946491) | Cod sursa (job #1731443) | Cod sursa (job #860748) | Cod sursa (job #1252687)
#include <fstream>
#include <vector>
#include <deque>
#define Nmax 200100
#define pb push_back
#define non(x) ((x) <= N ? (x + N) : (x - N))
#define Neighbour Graph[Node][i]
using namespace std;
vector <int> Graph[Nmax], GraphT[Nmax];
deque <int> Deque;
bool Answer, used[Nmax], Mark[Nmax];
int N;
void Dfs(int Node) {
if(Mark[Node]) {
Answer = false;
return;
}
used[Node] = false;
Mark[non(Node)] = true;
for(int i = 0; i < GraphT[Node].size(); i++)
if(used[GraphT[Node][i]])
Dfs(GraphT[Node][i]);
}
void topoSort(int Node) {
used[Node] = true;
for(int i = 0; i < Graph[Node].size(); i++)
if(!used[Neighbour])
topoSort(Neighbour);
Deque.push_front(Node);
}
void Solve() {
int Node;
for(Node = 1; Node <= (N << 1); Node++)
if(!used[Node])
topoSort(Node);
Answer = true;
for(Node = 0; Answer && Node < (N << 1); Node++)
if(used[Deque[Node]] && used[non(Deque[Node])])
Dfs(Deque[Node]);
}
void Read() {
int x, y, M;
ifstream in("2sat.in");
in >> N >> M;
while(M--) {
in >> x >> y;
if(x < 0)
x = N - x;
if(y < 0)
y = N - y;
Graph[non(x)].pb(y);
Graph[non(y)].pb(x);
GraphT[x].pb(non(y));
GraphT[y].pb(non(x));
}
in.close();
}
void Write() {
ofstream out("2sat.out");
if(!Answer)
out << "-1";
else
for(int i = 1; i <= N; i++)
out << Mark[i] << ' ';
out << '\n';
out.close();
}
int main() {
Read();
Solve();
Write();
return 0;
}