Pagini recente » Cod sursa (job #1117738) | Cod sursa (job #2733562) | Cod sursa (job #2365403) | Cod sursa (job #2775319) | Cod sursa (job #663666)
Cod sursa(job #663666)
#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 dfs(int nod) {
int i;
viz[nod]=0;
if(sol[nod])
return 0;
sol[non(nod)]=1;
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;i<=n;i++)
out<<sol[i]<<" ";
else
out<<"-1";
out<<'\n';
}
int main() {
int i,ans=1;
citire();
for(i=1,nr=2*n;i<=2*n;i++)
if(!viz[i])
sort_top(i);
for(i=1;i<=2*n&&ans;i++)
if(viz[deque[i]]&&viz[non(deque[i])]) {
ans=dfs(deque[i]);
nrc++;
}
afis(ans);
return 0;
}