Cod sursa(job #2472645)

Utilizator vesko465vesko penev vesko465 Data 12 octombrie 2019 17:30:40
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.19 kb
#include<iostream>
#include<vector>
#include<queue>
#include <fstream>
#define MAX_N 10000
using namespace std;


int n,m;
bool isVisited[2*MAX_N];
int SCC[2*MAX_N]; /// strongly connected components
int sign[2*MAX_N];

vector<int> neighbours[2*MAX_N];
vector<int> reverseNeighbours[2*MAX_N];
vector<int> visitOrder;

void Visit(int v){
    if(isVisited[v])return;
    isVisited[v] = true;
    for(auto i = neighbours[v].begin(); i!=neighbours[v].end();i++){
        Visit(*i);
    }
    visitOrder.push_back(v);
}

void Assaign(int v,int root){

    if(SCC[v]==-1){
        SCC[v] = root;
        for(auto i = reverseNeighbours[v].begin();
                i!=reverseNeighbours[v].end(); i++){
            Assaign((*i),root);
        }
    }
}

int main(){

    ofstream read;
    read.open ("2sat.in");

    ofstream print;
    print.open ("2sat.out");

    bool possibleSolution = true;
    for(int i=0;i<MAX_N*2;i++){
        SCC[i] = -1;
    }

    cin>>n>>m;
    int maxN = 2*n+1;
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        neighbours[n-a].push_back(n+b);
        neighbours[n-b].push_back(n+a);
        reverseNeighbours[n+b].push_back(n-a);
        reverseNeighbours[n+a].push_back(n-b);
    }

    for(int i=0;i<maxN;i++){
        if(i==n)continue;
        if(!isVisited[i]){
            Visit(i);
        }
    }

    for(auto i = visitOrder.end()-1; i>=visitOrder.begin();i--){
        Assaign((*i),(*i));
    }

    for(auto i = visitOrder.end()-1; i>=visitOrder.begin()&&possibleSolution;i--){

        int current = (*i);
        int other = 2*n-current;
        if(sign[current]==0){

            if(SCC[current]==SCC[other]){
                possibleSolution=false;
            }

            sign[current] = 1;
            sign[other] = -1;

        }

    }

    if(possibleSolution){
        for(int i=0;i<n;i++){
            if(sign[i]==-1){
                cout<<0;
            }else if(sign[i]==1){
                cout<<1;
            }else{
                cout<<"ERROR";
            }
            cout<<" ";
        }
    }else{
        cout<<"No Solution";
    }



    return 0;
}