Pagini recente » Cod sursa (job #1649684) | Cod sursa (job #2109405) | Cod sursa (job #1557353) | Cod sursa (job #3196490) | Cod sursa (job #2151921)
#include <iostream>
#include <fstream>
#include <list>
#include <stack>
using namespace std;
struct m
{
int coming=2; //0-false, 1-true, 2-not known
list<int>w0;
list<int>w1;
list<int>w2;
list<int>w3;
};
m man[101];
list<int>now;
void feltolt(int nr, bool &wrong)
{
now.push_back(nr);
if(!wrong)
{
if(man[nr].coming==1)
{
for(list<int>::iterator it=man[nr].w2.begin(); it!=man[nr].w2.end(); it++)
{
if(man[*it].coming==2)
{
man[*it].coming=1;
feltolt(*it, wrong);
}
else if(man[*it].coming==0) wrong=true;
}
for(list<int>::iterator it=man[nr].w3.begin(); it!=man[nr].w3.end(); it++)
{
if(man[*it].coming==2)
{
man[*it].coming=0;
feltolt(*it, wrong);
}
else if(man[*it].coming==1) wrong=true;
}
}
else
{
for(list<int>::iterator it=man[nr].w0.begin(); it!=man[nr].w0.end(); it++)
{
if(man[*it].coming==2)
{
man[*it].coming=1;
feltolt(*it, wrong);
}
else if(man[*it].coming==0) wrong=true;
}
for(list<int>::iterator it=man[nr].w2.begin(); it!=man[nr].w2.end(); it++)
{
if(man[*it].coming==2)
{
man[*it].coming=0;
feltolt(*it, wrong);
}
else if(man[*it].coming==1) wrong=true;
}
}
}
}
int main()
{
ifstream f("party.in");
ofstream g("party.out");
int n, k;
f>>n>>k;
int x, y, z;
for(int i=1; i<=k; i++)
{
f>>x>>y>>z;
switch(z)
{
case 0: man[x].w0.push_back(y);
man[y].w0.push_back(x);
break;
case 1: man[x].w1.push_back(y);
man[y].w2.push_back(x);
break;
case 2: man[x].w2.push_back(y);
man[y].w1.push_back(x);
break;
case 3: man[x].w3.push_back(y);
man[y].w3.push_back(x);
break;
}
}
/*for(int i=1; i<=n; i++)
{
cout<<"pont "<<i<<endl;
cout<<"0: ";
for(list<int>::iterator it=man[i].w0.begin(); it!=man[i].w0.end(); it++) cout<<*it<<" ";
cout<<endl;
cout<<"1: ";
for(list<int>::iterator it=man[i].w1.begin(); it!=man[i].w1.end(); it++) cout<<*it<<" ";
cout<<endl;
cout<<"2: ";
for(list<int>::iterator it=man[i].w2.begin(); it!=man[i].w2.end(); it++) cout<<*it<<" ";
cout<<endl;
cout<<"3: ";
for(list<int>::iterator it=man[i].w3.begin(); it!=man[i].w3.end(); it++) cout<<*it<<" ";
cout<<endl;
}*/
bool wrong;
for(int i=1; i<=n; i++)
{
if(man[i].coming==2)
{
man[i].coming=1;
now.clear();
wrong=false;
feltolt(i, wrong);
if(wrong)
{
for(list<int>::iterator it=now.begin(); it!=now.end(); it++) man[*it].coming=2;
man[i].coming=0;
wrong=true;
feltolt(i, wrong);
}
}
/*for(int i=1; i<=n; i++) if(man[i].coming==1) cout<<i<<" ";
cout<<endl;*/
}
int db=0;
for(int i=1; i<=n; i++) if(man[i].coming==1) db++;
g<<db<<endl;
for(int i=1; i<=n; i++) if(man[i].coming==1) g<<i<<endl;
return 0;
}