题目描述:
一个工人搞几个暖气,最后都打开
题解:
%2等于1的高斯消元
重点:
用^代替加法.
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <ctype.h>
#include <limits.h>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
#define CLR(a) memset(a, 0, sizeof(a))
#define REP(i, a, b) for(int i = a;i < b;i++)
#define REP_D(i, a, b) for(int i = a;i <= b;i++)
typedef long long ll;
using namespace std;
const int maxn = 250 + 100;
int a[maxn][maxn];
int x[maxn];
int n;
int equ, var;
int gauss()
{
for(int k = 0, col=0;k<equ&&col<var;k++,col++)
{
int max_k = k;
for(int i=k+1;i<equ;i++)
{
if(a[max_k][col]==1)
{
break;
}
if(a[i][col]==1)
{
max_k = i;
break;
}
}
if(a[max_k][col]==0)
{
return 0;
}
if(max_k!=k)
{
swap(x[k], x[max_k]);
for(int i = col;i<var;i++)
{
swap(a[k][i], a[max_k][i]);
}
}
for(int i=0;i<equ;i++)
{
if(i!=k)
{
if(a[i][col]==1)
{
a[i][col] = 0;
for(int j=col+1;j<var;j++)
{
a[i][j] ^= a[k][j];
}
x[i] ^= x[k];
}
}
}
}
return 1;
}
void solve()
{
CLR(a);
REP(i, 0, n)
{
int d;
while(scanf("%d", &d)&&d!=-1)
{
d--;
a[d][i] = 1;
}
}
REP(i, 0, n)
{
x[i] = 1;
}
equ = n;
var = n;
gauss();
vector<int> ans;
REP(i, 0, n)
{
if(x[i])
{
ans.push_back(i+1);
}
}
REP(i, 0, ans.size())
{
if(i==ans.size()-1)
{
printf("%d\n", ans[i]);
}
else
{
printf("%d ", ans[i]);
}
}
}
int main()
{
//freopen("10Jin.txt", "r", stdin);
//freopen("10Jout.txt", "w", stdout);
while(scanf("%d", &n) != EOF)
{
solve();
}
return 0;
}