Pagini recente » Cod sursa (job #1530973) | Cod sursa (job #490957) | Cod sursa (job #2822992) | Cod sursa (job #408901) | Cod sursa (job #3239571)
#include <bits/stdc++.h>
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int N = 100005;
vector<int> g[N*2], gt[2*N];
int n, m;
int bareaza(int x)
{
if ( x > 0 )
return x + n;
return -x;
}
int trnod(int x)
{
if ( x > 0 )
return x;
return (-x) + n;
}
void citire()
{
in>>n>>m;
for ( int i = 1 ; i <= m ; i++ )
{
int x, y;
in>>x>>y;
g[bareaza(x)].push_back(trnod(y));
g[bareaza(y)].push_back(trnod(x));
}
}
void make_gt()
{
for ( int i = 1 ; i <= n * 2 ; i++ )
{
for ( int x : g[i] )
{
gt[x].push_back(i);
}
}
}
vector<int> st_ctc;
bool viz[N*2];
void dfsimplu(int nod)
{
viz[nod] = true;
for ( int vec : g[nod] )
{
if ( viz[vec] )
continue;
dfsimplu(vec);
}
st_ctc.push_back(nod);
}
int ctc[2*N], nrctc;
void df_tr(int nod)
{
ctc[nod] = nrctc;
for ( int vec : gt[nod] )
{
if ( !ctc[vec] )
df_tr(vec);
}
}
void make_ctc()
{
for ( int i = 1 ; i <= n * 2 ; i++ )
{
if ( !viz[i] )
dfsimplu(i);
}
reverse(st_ctc.begin(), st_ctc.end());
make_gt();
for ( int x : st_ctc )
{
if ( !ctc[x] )
{
nrctc++;
df_tr(x);
}
}
}
void afis_graf()
{
for ( int i = 1 ; i <= n * 2 ; i++ )
{
cout<<i<<": ";
for ( int x : g[i] )
{
cout<<x<<" ";
}
cout<<'\n';
}
}
void afis_cc()
{
for ( int i = 1 ; i <= 2 * n ; i++ )
{
cout<<ctc[i]<<" ";
}
}
vector<int> gctc[N*2];
void rmdup(vector<int>& v)
{
if ( v.size() == 0 )
return;
vector<int> ans;
ans.push_back(v[0]);
for ( int i = 1 ; i < v.size() ; i++ )
{
if ( v[i] != ans[ans.size()-1] )
{
ans.push_back(v[i]);
}
}
while ( v.size() > 0 )
v.pop_back();
for ( int i : ans )
{
v.push_back(i);
}
}
void make_graf_ctc()
{
for ( int i = 1 ; i <= 2 * n ; i++ )
{
for ( int x : g[i] )
{
if ( ctc[i] != ctc[x] )
gctc[ctc[i]].push_back(ctc[x]);
}
}
for ( int i = 1 ; i <= nrctc ; i++ )
{
sort(gctc[i].begin(), gctc[i].end());
rmdup(gctc[i]);
}
}
void afis_graf_ctc()
{
for ( int i = 1 ; i <= nrctc ; i++ )
{
cout<<i<<": ";
for ( int x : gctc[i] )
{
cout<<x<<" ";
}
cout<<'\n';
}
}
vector<int> stop;
int vizi[2*N];
void dfs_sorttop(int nod)
{
for ( int vec : gctc[nod] )
{
if ( !vizi[vec] )
dfs_sorttop(vec);
}
stop.push_back(nod);
vizi[nod] = 1;
}
void make_sort_top()
{
vector<int> grad_in(2*N, 0);
for ( int i = 1 ; i <= nrctc ; i++ )
{
for ( int x : gctc[i] )
{
grad_in[x]++;
}
}
for ( int i = 1 ; i <= nrctc ; i++ )
{
if ( grad_in[i] == 0 )
dfs_sorttop(i);
}
reverse(stop.begin(), stop.end());
}
void rez()
{
make_ctc();
make_graf_ctc();
make_sort_top();
vector<int> ans(2*n+1, -1);
int st = 0;
int dr = stop.size() - 1;
while ( st < dr )
{
for ( int i = 1 ; i <= 2 * n ; i++ )
{
if ( ctc[i] == stop[st] )
ans[i] = 0;
if ( ctc[i] == stop[dr] )
ans[i] = 1;
}
st++;
dr--;
}
for ( int i = 1 ; i <= n ; i++ )
out<<ans[i]<<" ";
}
int main()
{
citire();
rez();
}