$O(tbc)$
f(x,y): x, y 사이 콩도르세 승자
승자만 남는 식으로 두 후보자를 비교하면 c-1번의 f를 사용해서 최종 우승 후보자 p를 찾을 수 있다.
p를 다른 후보와 한 번씩 f를 통해 비교하면 콩도르세 우승자를 결정할 수 있다.
#include<cstdio> int t, idx[500][2500], b, c; int f(int x, int y) { int w = 0; for (int i = 0; i < b; i++) w += 1 - 2 * (idx[i][x] < idx[i][y]); return w<0 ? x : y; } int main() { for (int t = 1; scanf("%d %d", &b, &c) && b; t++) { int i, j, x, p = 0; for (i = 0; i < b; i++)for (j = 0; j < c; j++) scanf("%d", &x), idx[i][x] = j; for (i = 1; i < c; i++) p = f(p, i); for (i = 0; i < c; i++) if (i^p&&f(p, i) ^ p) break; printf("Case %d: ", t); i^c ? puts("No Condorcet winner") : printf("%d\n", p); } return 0; }
댓글 없음 :
댓글 쓰기