範例程式碼 uva11659

//uva11659
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n = 0, a = 0, x = 0, y = 0;
    vector<int> ifm_rel;
    vector<int> ifm_unrel;

    while (cin >> n >> a && (n || a)) {
        ifm_rel.assign(n + 1, 0);
        ifm_unrel.assign(n + 1, 0);

        for (int i = 0; i < a; i++) {
            cin >> x >> y;
            if (y > 0)
                ifm_rel[x] |= 1 << (y - 1);
            if (y < 0)
                ifm_unrel[x] |= 1 << (-y - 1);
        }

        int maxim_situ = 1 << n;
        int max_ifm_rel = 0;
        bool conflict = false;
        for (int i = 0; i < maxim_situ; i++) {
            int ifm_case = i;
            conflict = false;

            for (int j = 1; j <= n; j++) {
                if ((ifm_case & (1 << (j - 1))) == 0)
                    continue;

                if ((ifm_unrel[j] & i) != 0 || (ifm_rel[j] & i) != ifm_rel[j]) {
                    conflict = true;
                    break;
                }
            }
            if (!conflict) {
                int count = 0;

                while (ifm_case) {
                    if (ifm_case & 1)
                        count++;
                    ifm_case >>= 1;
                }
                max_ifm_rel = max(count, max_ifm_rel);
            }
        }
        cout << max_ifm_rel << endl;
    }

    return 0;
}