Pagini recente » Cod sursa (job #2576550) | Cod sursa (job #3194547) | Cod sursa (job #157620) | Cod sursa (job #1640470) | Cod sursa (job #2292444)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define MAXN 100001
using namespace std;
vector<int> G[2*MAXN+1];
vector<int> GT[2*MAXN+1];
int vis[2*MAXN+1], N, M, comp_i=-1;
vector<int> v_assign;
stack<int> S;
void Read()
{
ifstream f("2sat.in");
f>>N>>M;
for (int i=-N;i<=N;i++)
{
if (i==0)
continue;
G[N+i].push_back(0);
GT[N+i].push_back(0);
}
int a, b;
for (int i=0;i<M;i++)
{
f>>a>>b;
G[N-a].push_back(b);
G[N-a][0]++;
G[N-b].push_back(a);
G[N-b][0]++;
GT[N+a].push_back(-b);
GT[N+a][0]++;
GT[N+b].push_back(-a);
GT[N+b][0]++;
}
}
void Visit(int a)
{
vis[N+a]=-1;
for (int i=1;i<=G[N+a][0];i++)
if (vis[N+G[N+a][i]]==0)
Visit(G[N+a][i]);
S.push(a);
}
void Assign(int a, int root)
{
vis[N+a]=comp_i;
for (int i=1;i<=GT[N+a][0];i++)
if (vis[GT[N+a][i]]==-1)
Assign(GT[N+a][i], root);
}
void KosarajuSharir()
{
for (int i=-N;i<=N;i++)
{
if (i==0)
continue;
if (vis[N+i]==0)
Visit(i);
}
while (!S.empty())
{
int a=S.top();
if (vis[N+a]==-1)
{
++comp_i;
v_assign.push_back(0);
Assign(a, a);
}
else
S.pop();
}
}
void Solve()
{
int i=0, j=v_assign.size()-1;
while (i<j)
{
v_assign[i]=0;
v_assign[j]=1;
i++;
j--;
}
for (int i=-N;i<=N;i++)
{
if (i==0)
continue;
vis[N+i]=v_assign[vis[N+i]];
}
}
void Write()
{
ofstream g("2sat.out");
for (int i=1;i<=N;i++)
g<<vis[N+i]<<' ';
}
int main()
{
Read();
KosarajuSharir();
Solve();
Write();
}