Pagini recente » Cod sursa (job #3292937) | Cod sursa (job #3121860) | Cod sursa (job #3290981) | Utilizatori inregistrati la Concurs de incalzire 2020 | Cod sursa (job #3294264)
#include <bits/stdc++.h>
#define VMAX 100005
#define INF 2000000000
using namespace std;
ifstream fin ("2sat.in");
ofstream fout ("2sat.out");
vector<int> graf[2*VMAX]; // 1-n muchii cu -, n+1-2*n - muchii normale
vector<int> graf_inv[2*VMAX];
vector<int> graf_nou[2*VMAX];
vector<int> componente[2*VMAX];
int scc[2*VMAX];
int nr_componente;
vector<int> coada;
bool vizitat[2*VMAX];
int n;
int not_a(int x)
{
if(x<=n)
return x+n;
else
return x-n;
}
void dfs(int nod)
{
vizitat[nod]=1;
for(auto i:graf[nod])
{
if(vizitat[i]==0)
dfs(i);
}
coada.push_back(nod);
}
void dfs_inv(int nod)
{
componente[nr_componente].push_back(nod);
scc[nod]=nr_componente;
vizitat[nod]=1;
for(auto i:graf_inv[nod])
{
if(vizitat[i]==0)
dfs_inv(i);
}
}
int main()
{
int m,i,j,k,t,q,nr,minim,maxim,suma;
fin>>n>>m;
for(i=0;i<m;i++)
{
fin>>j>>k;
if(j<=0)
j=abs(j);
else
j+=n;
if(k<=0)
k=abs(k);
else
k+=n;
j=not_a(j);
graf[j].push_back(k);
graf_inv[k].push_back(j);
j=not_a(j);
k=not_a(k);
graf[k].push_back(j);
graf_inv[j].push_back(k);
}
for(i=1;i<=2*n;i++)
if(vizitat[i]==0)
dfs(i);
for(i=1;i<=2*n;i++)
vizitat[i]=0;
while(coada.size())
{
i=coada.back();
coada.pop_back();
if(vizitat[i]==0)
{
dfs_inv(i);
nr_componente++;
}
}
for(i=1;i<=n;i++)
if(scc[i]==scc[i+n])
break;
if(i<=n)
{
fout<<"-1\n";
return 0;
}
else
{
for(i=1;i<=n;i++)
{
fout<<(scc[i]<scc[not_a(i)])<<' ';
}
}
for(i=0;i<nr_componente;i++)
{
for(j=1;j<componente[i].size();j++)
{
for(k=0;k<graf_inv[componente[i][j]].size();k++)
{
graf[graf_inv[componente[i][j]][k]].push_back(componente[i][0]);
}
for(k=0;k<graf[componente[i][j]].size();k++)
graf[componente[i][0]].push_back(graf[componente[i][j]][k]);
}
}
return 0;
}