您的位置:首页 > 其它

URAL 1042 Central Heating

2012-05-11 17:30 169 查看
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]
= 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]
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: