Pagini recente » Cod sursa (job #1986694) | Cod sursa (job #1439971) | Cod sursa (job #1579574) | Cod sursa (job #2780001) | Cod sursa (job #3186938)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
int n, m;
const int N = 3e5 + 5;
int viz[N], ctc[N];
vector <int> topsort;
vector <int> g[N], invg[N];
void dfs(int nod)
{
viz[nod] = 1;
for(auto x:g[nod])
{
if(!viz[x])
{
dfs(x);
}
}
topsort.push_back(nod);
}
void kosaraju(int nod, int cnt)
{
viz[nod] = 0;
ctc[nod] = cnt;
for(auto x:invg[nod])
{
if(viz[x])
{
kosaraju(x, cnt);
}
}
}
int neg(int x)
{
if(x > n)
{
return x - n;
}
return x + n;
}
signed main()
{
in >> n >> m;
while(m--)
{
int x, y;
in >> x >> y;
if(x < 0)
{
x = -x + n;
}
if(y < 0)
{
y = -y + n;
}
g[neg(x)].push_back(y);
g[neg(y)].push_back(x);
invg[x].push_back(neg(y));
invg[y].push_back(neg(x));
}
for(int i = 1; i <= 2 * n; i++)
{
if(viz[i] == 0)
{
dfs(i);
}
}
int cnt = 0;
reverse(topsort.begin(), topsort.end());
for(auto x:topsort)
{
if(viz[x] == 1)
{
++cnt;
kosaraju(x, cnt);
}
}
for(int i = 1; i <= n; i++)
{
if(ctc[i] == ctc[i + n])
{
out << -1;
return 0;
}
}
for(int i = 1; i <= n; i++)
{
if(ctc[i] < ctc[i + n])
{
out << 0 << ' ';
}
else
{
out << 1 << ' ';
}
}
return 0;
}