Cod sursa(job #2149172)

Utilizator bori2000Fazakas Borbala bori2000 Data 2 martie 2018 13:04:34
Problema Party Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.8 kb
#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;
}