Cod sursa(job #877654)

Utilizator enedumitruene dumitru enedumitru Data 13 februarie 2013 01:01:17
Problema 2SAT Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <cstring>
#include <vector> 
#define NMAX 200005 
#define pb push_back 
using namespace std; 
int n,m,A[NMAX],r,sol[NMAX]; 
vector <int> G[NMAX],GT[NMAX]; 
char viz[NMAX]; 
inline int neg(int x) {return x<=n ? x+n : x-n;} 
void read() 
{ 	freopen("2sat.in","r",stdin); 
    scanf("%d%d",&n,&m); 
    for (int x,y,i=1; i<=m; i++) 
    {   scanf("%d%d",&x,&y); 
        if (x<0) x=-x+n; 
        if (y<0) y=-y+n; 
        G[neg(y)].pb(x);  GT[x].pb(neg(y));  
        G[neg(x)].pb(y);  GT[y].pb(neg(x));  
    } 
} 
void dfs(int nod) 
{   viz[nod]=1; 
    int vec; 
    for(unsigned int i=0; i<G[nod].size(); i++) 
    {   vec=G[nod][i]; 
        if (!viz[vec]) 
            dfs(vec); 
    } 
    A[++r]=nod; 
} 
void dfs2(int nod) 
{   if (sol[nod]) 
    //{printf("-1\n"); exit(0);} 
	{printf("-1\n"); return ;} 
    viz[nod]=1; 
    sol[nod]=0; sol[neg(nod)]=1; 
    int vec; 
    for(unsigned int i=0; i<GT[nod].size(); i++) 
    {   vec=GT[nod][i]; 
        if (!viz[vec]) dfs2(vec); 
    } 
} 
void solve() 
{   for(int i=1; i<=2*n; i++) 
        if (!viz[i]) dfs(i); 
    memset(viz,0,sizeof(viz)); 
    for(int i=r; i>=1; i--) 
        if (!viz[A[i]] && !viz[neg(A[i])]) dfs2(A[i]);
	freopen("2sat.out","w",stdout);		
    for(int i=1; i<=n; i++) printf("%d ",sol[i]); 
} 
int main() 
{   read(); solve(); return 0;}