Cod sursa(job #2630366)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 25 iunie 2020 14:46:00
Problema Party Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.16 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream fin("party.in");
ofstream fout("party.out");

vector <pair <int, int>> v[101];
int val[101]; //-1 = aleg, 0 = nu participa, 1 = participa
int o[101]; //o = participantul de la care mi-a rezultat valoarea de adevar
int x;

int n;

bool gata;

bool dfs(int r)
{
    int i;
    bool ok = 1;
    o[r] = x;
    for (i = 0; i<v[r].size(); i++)
    {
        if (v[r][i].second == 0)
        {
            //fout << r;
            if (o[v[r][i].first] == 0)
            {
                val[v[r][i].first] = 1 - val[r];
                ok = dfs(v[r][i].first);
                if (ok == 0)
                    return 0;
            }
            else if (val[v[r][i].first] == val[r])
                return 0;
        }
        else if (v[r][i].second == 1)
        {
            if (val[r] == 0)
            {
                if (o[v[r][i].first] == 0)
                {
                    val[v[r][i].first] = 0;
                    ok = dfs(v[r][i].first);
                    if (ok == 0)
                        return 0;
                }
                else if (val[v[r][i].first] == 1)
                    return 0;
            }
        }
        else if (v[r][i].second == 2)
        {
            if (o[v[r][i].first] != 0)
            {
                if (val[r] == 1 && val[v[r][i].first] == 0)
                    return 0;
            }
        }
        else
        {
            if (val[r] == 1)
            {
                if (o[v[r][i].first] == 0)
                {
                    val[v[r][i].first] = 0;
                    ok = dfs(v[r][i].first);
                    if (ok == 0)
                        return 0;
                }
                else if (val[v[r][i].first] == 1)
                    return 0;
            }
        }
    }
    return 1;
}

void bkt(int k)
{
    int i, j;
    bool ok;
    for (i = k; i<=n && gata == 0; i++)
        if (o[i] == 0)
        {
            val[i] = 1;
            x = i;
            ok = dfs(i);
            if (ok == 1)
                bkt(i+1);
            
            if (gata == 1)
                return ;
            
            val[i] = 0;
            x = i;
            for (j = k; j<=n; j++)
                if (o[j] == x)
                    o[j] = 0;
            ok = dfs(i);
            
            if (ok == 1)
                bkt(i+1);
            
            x = i;
            for (j = k; j<=n; j++)
                if (o[j] == x)
                    o[j] = 0;
            
            break;
        }
    if (i > n) //adica am bagat toate valorile
        gata = 1;
}

int main()
{
    int m, i, x, y, t;
    fin >> n >> m;
    for (i = 1; i<=m; i++)
    {
        fin >> x >> y >> t;
        if (t == 2)
            swap(x, y);
        if (t == 1 || t == 2)
        {
            v[x].push_back({y, 1});
            v[y].push_back({x, 2});
        }
        else
        {
            v[x].push_back({y, t});
            v[y].push_back({x, t});
        }
    }
    bkt(1);
    int nr = 0;
    for (i = 1; i<=n; i++)
        nr = nr + val[i];
    fout << nr << '\n';
    for (i = 1; i<=n; i++)
        if (val[i] == 1)
            fout << i << '\n';
    return 0;
}