Investigating Legions(思维)

Investigating Legions

点击题目跳转

题意

给你一个 n 个点的图的邻接矩阵 ( n <= 300 ) ,其中每个元素都有 1 / S (20 <= S <= 100) 的几率出错,要求复原原图中那些点是在一个连通块里的,既然如此,可以假设只要有一半的数据给出两个士兵在一个队伍里,那该数据正确,反之错误。

#include

using namespace std;
int f[510][510], a[510];
vector<int> v;

int main() {
    int t, n, s, x, y, num, i, j, k;
    char c;
    scanf("%d", &t);
    while (t--) {
        memset(a, -1, sizeof(a));
        memset(f, 0, sizeof(f));
        x = 0;
        scanf("%d%d", &n, &s);
        // 两士兵关系
        for (i = 1; i <= n; i++) {
            for (j = i + 1; j <= n; j++) {
                scanf(" %c", &c);
                f[i][j] = f[j][i] = c - '0';
            }
            f[i][i] = 1;
        }
        for (i = 1; i <= n; i++) {
            if (a[i] != -1) {
                continue;
            }
            v.clear();
            for (j = 1; j <= n; j++) {
                if (f[i][j] && a[j] == -1) {
                    v.push_back(j);
                }
            }
            // v:num 个可能与 i 一组的士兵
            num = v.size();
            for (j = 1; j <= n; j++) {
                if (a[j] != -1) {
                    continue;
                }
                y = 0;
                for (k = 0; k < v.size(); k++) {
                    if (f[v[k]][j]) {
                        y++;
                    }
                }
                if (y >= num / 2) {
                    a[j] = x;
                }
            }
            x++;
        }
        for (i = 1; i <= n; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(杂题)