ZOJ-1501

来源:互联网 发布:mac系统截图 编辑:程序博客网 时间:2024/06/09 16:45

Floyd求传递闭包,然后统计每个点的入度和出度,入度表示输的场次,出度表示赢的场次,然后名次就显而易见了

#include<stdio.h>#include<string.h>int main(){int n, m, first = 1, temp[128], map[129][129], win[129], lose[129];while (scanf("%d", &n), n){if (!first)putchar('\n');elsefirst = 0;memset(map, 0, sizeof(map));memset(win, 0, sizeof(win));memset(lose, 0, sizeof(lose));int i, j, k, num, t = 1 << n;for (i = 0; i < t; i++)temp[i] = i + 1;for (i = n - 1; i >= 0; i--)for (j = 0; j < 1 << i; j++){scanf("%d", &num);if (temp[2 * j] == num)map[num][temp[2 * j + 1]] = 1;elsemap[num][temp[2 * j]] = 1;temp[j] = num;}for (k = 1; k <= t; k++)for (i = 1; i <= t; i++)for (j = 1; j <= t; j++)map[i][j] = map[i][j] || (map[i][k] && map[k][j]);for (i = 1; i <= t; i++)for (j = 1; j <= t; j++)if (map[i][j]){win[i]++;lose[j]++;}scanf("%d", &m);for (i = 0; i < m; i++){scanf("%d", &num);printf("Player %d can be ranked as high as %d or as low as %d.\n",num, lose[num] + 1, t - win[num]);}}return 0;}


0 0