Pagini recente » Cod sursa (job #2533250) | Cod sursa (job #3191287) | Cod sursa (job #238627) | Cod sursa (job #1869407) | Cod sursa (job #2325904)
#include <bits/stdc++.h>
#define NMAX 200010
using namespace std;
ifstream fi("2sat.in");
ofstream fo("2sat.out");
int N, M;
int components[NMAX];
int visited[NMAX];
vector<int> adjacentMatrix[NMAX];
vector<int> transposedAdjacentMatrix[NMAX];
stack<int> stacc;
stack<int> stacc2;
void satisfyDepth(int node)
{
if(visited[node] != -1 || visited[node^1] != -1)
return;
visited[node] = 0;
for(auto y:transposedAdjacentMatrix[node])
{
satisfyDepth(y);
}
}
void depthSearch(int node)
{
if(components[node])
return;
components[node] = 1;
for(auto y:adjacentMatrix[node])
depthSearch(y);
stacc.push(node);
}
void transposedDepthFirst(int node, int paint)
{
if(components[node])
return;
components[node] = paint;
for(auto y:transposedAdjacentMatrix[node])
transposedDepthFirst(y, paint);
}
int main()
{
fi>>N>>M;
for(int i = 1; i <= M; ++i)
{
int a,b;
fi>>a>>b;
if(a > 0) a = a*2;
else a = -a*2 + 1;
if(b > 0) b = b*2;
else b = -b*2 + 1;
adjacentMatrix[a^1].push_back(b);
adjacentMatrix[b^1].push_back(a);
transposedAdjacentMatrix[a].push_back(b^1);
transposedAdjacentMatrix[b].push_back(a^1);
}
for(int i = 2; i <= 2*N+1; ++i)
depthSearch(i);
for(int i = 2; i <= 2*N+1; ++i)
{
components[i] = 0;
visited[i] = -1;
}
stacc2 = stacc;
int componentNumber = 0;
while(!stacc.empty())
{
if(components[stacc.top()] == 0)
{
componentNumber++;
transposedDepthFirst(stacc.top(),componentNumber);
}
stacc.pop();
}
for(int i = 2; i <= 2*N+1; ++i)
{
cout<<i<<": ";
for(auto y:adjacentMatrix[i])
cout<<y<<" ";
cout<<"\n";
}
for(int i = 2; i <= 2*N; i += 2)
{
if(components[i^1] == components[i])
{
fo<<-1;
return 0;
}
}
while(!stacc2.empty())
{
int node = stacc2.top();
satisfyDepth(node);
stacc2.pop();
}
for(int i = 2; i <= 2*N; i += 2)
{
if(visited[i] != -1)
fo<<visited[i]<<" ";
else
fo<<1-visited[i^1]<<" ";
}
}