写的有点渣渣太长了。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
#define MAXN 255
int equ,var;
int a[MAXN][MAXN];
int x[MAXN];
int free_x[MAXN];
int free_num;
int hash[MAXN];
int Gauss()//模板
{
int max_r,col,k;
free_num = 0;
for(k = 0, col = 0 ; k < equ && col < var ; k++, col++)
{
max_r = k;
for(int i = k+1;i < equ;i++)
{
if(abs(a[i][col]) > abs(a[max_r][col]))
max_r = i;
}
if(a[max_r][col] == 0)
{
k--;
free_x[free_num++] = col;
hash[col]=1;
continue;
}
if(max_r != k)
{
for(int j = col; j < var+1; j++)
swap(a[k][j],a[max_r][j]);
}
for(int i = k+1;i < equ;i++)
{
if(a[i][col] != 0)
{
for(int j = col;j < var+1;j++)
a[i][j] ^= a[k][j];
}
}
}
for(int i = k;i < equ;i++)
if(a[i][col] != 0)
return -1;
if(k < var) return var-k;
for(int i = var-1; i >= 0;i--)
{
x[i] = a[i][var];
for(int j = i+1;j < var;j++)
x[i] ^= (a[i][j] && x[j]);
}
return 0;
}
int minn=MAXN;
int temp[205];
int c;
void dfs(int pos)
{
if (pos==free_num)
{
c=0;
for(int i = var-1-free_num; i >= 0;i--)
{
int pripos=i;
for (int j=i;j<var;j++)
if (!hash[j])
{
pripos=j;
break;
}
x[pripos] = a[i][var];
for(int j = i;j < var;j++)
if (j!=pripos)
x[pripos] ^= (a[i][j] && x[j]);
}
int ans[MAXN];
for (int i=0;i<=var-1;i++)
if (x[i])
ans[c++]=i+1;
if (c<minn)
{
minn=c;
for (int i=0;i<=c-1;i++)
temp[i]=ans[i];
}
else if (c==minn)
{
bool flag=false;
for (int i=0;i<=c-1;i++)
if (temp[i]>ans[i])
{
flag=true;
break;
}
if (flag)
for (int i=0;i<=c-1;i++)
temp[i]=ans[i];
}
return;
}
x[free_x[pos]]=0;
dfs(pos+1);
x[free_x[pos]]=1;
dfs(pos+1);
}
int main()
{
int n;
int i;
scanf("%d",&n);
for (i=0;i<=n-1;i++)
{
while (1)
{
int ac;
scanf("%d",&ac);
if (ac==-1)
break;
a[ac-1][i]=1;
}
}
for (i=0;i<=n-1;i++)
a[i][n]=1;
equ=var=n;
int g=Gauss();
if (g==-1)
printf("No solution\n");
else if (g==0)
{
c=0;
for (i=0;i<=n-1;i++)
if (x[i])
temp[c++]=i+1;
for (i=0;i<c-1;i++)
printf("%d ",temp[i]);
printf("%d\n",temp[i]);
}
else
{
c=0;
dfs(0);
for (i=0;i<minn-1;i++)
printf("%d ",temp[i]);
printf("%d\n",temp[i]);
}
}