URAL 1042 Central Heating

URAL_1042

    由于题目中说明了每个工人不能被其他工人取代,也就是说如果矩阵的列向量是线性无关的,于是增广矩阵的秩一定是N,所以不会有无解的情况,并且解是唯一的,所以直接用高斯消元求解即可。

#include<stdio.h>

#include<string.h>

#include<iostream>

#define MAXD 260

using namespace std;

int N, mat[MAXD][MAXD], ans[MAXD];

void init()

{

    int i, j, k;

    memset(mat, 0, sizeof(mat));

    for(i = 0; i < N; i ++)

    {

        for(;;)

        {

            scanf("%d", &j);

            if(j == -1)

                break;

            mat[j - 1][i] = 1;

        }

        mat[i][N] = 1;

    }

}

void gauss()

{

    int i, j, k;

    for(i = 0; i < N; i ++)

    {

        if(mat[i][i] == 0)

        {

            for(j = i + 1; j < N; j ++)

                if(mat[j][i])

                {

                    for(k = i; k <= N; k ++)

                        swap(mat[i][k], mat[j][k]);

                    break;

                }

        }

        for(j = i + 1; j < N; j ++)

            if(mat[j][i])

            {

                for(k = i; k <= N; k ++)

                    mat[j][k] ^= mat[i][k];

            }

    }

    for(i = N - 1; i >= 0; i --)

    {

        ans[i] = mat[i][N];

        for(j = i + 1; j < N; j ++)

            ans[i] ^= mat[i][j] * ans[j];

    }

}

void solve()

{

    int i, j, k, flag = 0;

    gauss();

    for(i = 0; i < N; i ++)

        if(ans[i])

        {

            if(flag)

                printf(" ");

            else

                flag = 1;

            printf("%d", i + 1);

        }

    printf("\n");

}

int main()

{

    while(scanf("%d", &N) == 1)

    {

        init();

        solve();

    }

    return 0;

}

你可能感兴趣的:(in)