Pagini recente » Cod sursa (job #2945762) | Cod sursa (job #3194482) | Cod sursa (job #2559431) | Cod sursa (job #1653134) | Cod sursa (job #663634)
Cod sursa(job #663634)
#include<fstream>
#include<vector>
#define NMAx 200100
#define non(x) x<=n?x+n:x-n
using namespace std;
vector <int> G[NMAx],Gt[NMAx],comp[NMAx];
int n,nr,nrc,deque[NMAx],sol[NMAx];
bool viz[NMAx];
bool solve() {
int i,j;
for(i=0;i<nrc/2;i++) {
for(j=0;j<comp[i].size();j++)
if(sol[comp[i][j]])
return 0;
for(j=0;j<comp[nrc-i-1].size();j++)
sol[comp[nrc-i-1][j]]=1;
}
return 1;
}
void dfs(int nod) {
int i;
viz[nod]=0;
comp[nrc].push_back(nod);
for(i=0;i<Gt[nod].size();i++)
if(viz[Gt[nod][i]])
dfs(Gt[nod][i]);
}
void sort_top(int nod) {
int i,vec;
viz[nod]=1;
for(i=0;i<G[nod].size();i++)
if(!viz[G[nod][i]]) {
vec=G[nod][i];
sort_top(vec);
}
deque[nr--]=nod;
}
void citire() {
int i,x,y,m;
ifstream in("2sat.in");
in>>n>>m;
for(i=0;i<m;i++) {
in>>x>>y;
if(x<0) x=n-x;
if(y<0) y=n-y;
G[non(x)].push_back(y);
G[non(y)].push_back(x);
Gt[x].push_back(non(y));
Gt[y].push_back(non(x));
}
in.close();
}
void afis(int ans) {
int i;
ofstream out("2sat.out");
if(ans)
for(i=1,n/=2;i<=n;i++)
out<<sol[i]<<" ";
else
out<<"-1";
out<<'\n';
}
int main() {
int i,ans;
citire();
for(i=1,n*=2,nr=n;i<=n;i++)
if(!viz[i])
sort_top(i);
for(i=1;i<=n;i++)
if(viz[deque[i]]) {
dfs(deque[i]);
nrc++;
}
ans=solve();
afis(ans);
return 0;
}