範例程式碼 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;
}