Cod sursa(job #3359435)

Utilizator rares89_Dumitriu Rares rares89_ Data 27 iunie 2026 21:15:27
Problema Party Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;
int fixat[105];
vector<array<int, 3>> cer;

int nod(int x, int val) {
    return 2 * (x - 1) + val;
}

void add(vector<vector<int>> &g, vector<vector<int>> &gt, int a, int b) {
    g[a].push_back(b);
    gt[b].push_back(a);
}

void clauza(vector<vector<int>> &g, vector<vector<int>> &gt, int a, int b) {
    add(g, gt, a ^ 1, b);
    add(g, gt, b ^ 1, a);
}

int ok() {
    vector<vector<int>> g(2 * n), gt(2 * n);

    for(auto it : cer) {
        int x = it[0], y = it[1], z = it[2];

        if(z == 0) {
            clauza(g, gt, nod(x, 1), nod(y, 1));
        } else if(z == 1) {
            clauza(g, gt, nod(x, 1), nod(y, 0));
        } else if(z == 2) {
            clauza(g, gt, nod(x, 0), nod(y, 1));
        } else {
            clauza(g, gt, nod(x, 0), nod(y, 0));
        }
    }

    for(int i = 1; i <= n; i++) {
        if(fixat[i] == -1) {
            continue;
        }

        int x = nod(i, fixat[i]);
        clauza(g, gt, x, x);
    }

    vector<int> viz(2 * n), ord, comp(2 * n, -1);

    function<void(int)> dfs1 = [&](int x) {
        viz[x] = 1;

        for(int y : g[x]) {
            if(!viz[y]) {
                dfs1(y);
            }
        }

        ord.push_back(x);
    };

    function<void(int, int)> dfs2 = [&](int x, int c) {
        comp[x] = c;

        for(int y : gt[x]) {
            if(comp[y] == -1) {
                dfs2(y, c);
            }
        }
    };

    for(int i = 0; i < 2 * n; i++) {
        if(!viz[i]) {
            dfs1(i);
        }
    }

    reverse(ord.begin(), ord.end());

    int cnt = 0;

    for(int x : ord) {
        if(comp[x] == -1) {
            dfs2(x, ++cnt);
        }
    }

    for(int i = 1; i <= n; i++) {
        if(comp[nod(i, 0)] == comp[nod(i, 1)]) {
            return 0;
        }
    }

    return 1;
}

int main() {
    fin >> n >> m;

    for(int i = 1; i <= m; i++) {
        int x, y, z;
        fin >> x >> y >> z;

        cer.push_back({x, y, z});
    }

    for(int i = 1; i <= n; i++) {
        fixat[i] = -1;
    }

    for(int i = 1; i <= n; i++) {
        fixat[i] = 1;

        if(!ok()) {
            fixat[i] = 0;
        }
    }

    vector<int> ans;

    for(int i = 1; i <= n; i++) {
        if(fixat[i]) {
            ans.push_back(i);
        }
    }

    fout << ans.size() << "\n";

    for(int x : ans) {
        fout << x << "\n";
    }

    return 0;
}