Cod sursa(job #2131308)

Utilizator ZanoxNonea Victor Zanox Data 14 februarie 2018 16:46:46
Problema Party Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.37 kb
#include <fstream>
#include <iostream>
#include <stack>
#include <set>
#include <list>

using namespace std;

struct supposition
{
    int v;
    int i;
    list<int> vard;
};

stack<supposition> st;
set<int> unks;

#define TRUE 1
#define FALSE 0
#define UNK 2

#define NEW 0
#define SWITCH 1

list<int>   a[101], // !x => y
            b[101], // !x => !y
            c[101]; // x => !y

char val[101];
int n,m,i,j,x,y,z,v,mod,t;

int deduce(int);

int asgn(int i,int v)
{
    if(val[i]==v)return 1;
    if(val[i]==UNK)
    {
        val[i]=v;
        unks.erase(i);
        st.top().vard.push_back(i);
        return deduce(i);
    }
    else return 0;
}

int deduce(int i)
{
    int v=val[i];
    int t;
    list<int>::iterator it;
    if(v==0)
    {
        for(it=a[i].begin();it!=a[i].end();it++)
        {
            t=asgn(*it,1);
            if(t==0)return 0;
        }
        for(it=b[i].begin();it!=b[i].end();it++)
        {
            t=asgn(*it,0);
            if(t==0)return 0;
        }
    }
    else
    {
        for(it=c[i].begin();it!=c[i].end();it++)
        {
            t=asgn(*it,0);
            if(t==0)return 0;
        }
    }
    return 1;
}

void print_values()
{
    for(int i=1;i<=n;i++)
    {
        if(val[i]==UNK)cout<<"UNK";
        else cout<<val[i]+0;
        cout<<' ';
    }
    cout<<'\n';
}

int main()
{
    fstream f("party.in",ios::in),g("party.out",ios::out);
    f>>n>>m;
    for(i=1;i<=n;i++){val[i]=UNK;unks.insert(i);}
    for(i=0;i<m;i++)
    {
        f>>x>>y>>z;
        if(z==0)
        {
            a[x].push_back(y);
            a[y].push_back(x);
        }
        else if(z==1)
        {
            b[x].push_back(y);
        }
        else if(z==2)
        {
            b[y].push_back(x);
        }
        else if(z==3)
        {
            c[x].push_back(y);
            c[y].push_back(x);
        }
    }
    mod=NEW;
    while(!unks.empty())
    {
        //print_values();
        if(mod==NEW)
        {
            supposition s;
            s.i=*(unks.begin());
            s.v=1;
            st.push(s);

            unks.erase(s.i);
            val[s.i]=s.v;

            t=deduce(s.i);
            if(t)mod=NEW;
            else mod=SWITCH;
        }
        else if(mod==SWITCH)
        {
            for(list<int>::iterator it=st.top().vard.begin();it!=st.top().vard.end();it++)
            {
                val[*it]=UNK;
                unks.insert(*it);
            }
            supposition s=st.top();
            s.v=0;
            val[s.i]=s.v;

            t=deduce(s.i);
            if(t)mod=NEW;
            else
            {
                mod=SWITCH;

                while(st.top().v==0)
                {
                    for(list<int>::iterator it=st.top().vard.begin();it!=st.top().vard.end();it++)
                    {
                        val[*it]=UNK;
                        unks.insert(*it);
                    }
                    supposition s=st.top();
                    val[s.i]=UNK;
                    unks.insert(s.i);
                    st.pop();
                }
            }
        }
        //print_values();cout<<'\n';
    }
    int s=0;
    for(i=1;i<=n;i++)if(val[i]==TRUE)s++;
    g<<s<<'\n';
    for(i=1;i<=n;i++)if(val[i]==TRUE)g<<i<<'\n';
}