Pagini recente » Cod sursa (job #1964987) | Cod sursa (job #2131259)
#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 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 1;
}
else return 0;
}
int deduce()
{
int i=st.top().i;
int v=st.top().v;
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();
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;
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';
}