不知道错哪了呜呜呜
#include <cstdio>
#include <algorithm>
#include <set>
#include <cmath>
#include <cstring>
std::set<int> s;
void read();
void gauss();
const int N = 110;
int c[N][N],n,m,cnt,rans;
double a[N][N],x[N];
bool nosol;
inline bool noint(double x){
if (floor(x) == x)
return 0;
return 1;
}
int main(){
read();
for (int i1 = 1;i1 <= n+1 && cnt <= 1;++i1){
int fault = i1;
int hh = 0;
for (int i2 = 1;i2 <= n+1;++i2){
if (i2 == fault)
continue;
hh++;
for (int k = 1;k <= n+1;++k)
a[hh][k] = c[i2][k];
}
gauss();
if (nosol == true)
continue;
else
cnt++;
}
if (cnt != 1)
puts("illegal");
else
printf("%d\n",rans);
return 0;
}
void read(){
scanf("%d",&n);
for (int i = 1;i <= n+1;++i){
s.clear();
scanf("%d",&m);
for (int j = 1;j <= m;++j){
int tmp;
scanf("%d",&tmp);
s.insert(tmp);
}
scanf("%d",&c[i][n+1]);
for (int k = 1;k <= n;++k)
if (s.find(k) != s.end())
c[i][k] = 1;
}
}
void gauss(){
nosol = false;
int ans = 0;
for (int j = 1;j <= n;++j){
int maxi = j;
for (int i = j;i <= n;++i)
if (a[maxi][j] < a[i][j])
maxi = i;
if (fabs(a[maxi][j]) <= 1e-5){
nosol = true;
return;
}
for (int k = 1;k <= n+1;++k)
std::swap(a[j][k],a[maxi][k]);
for (int i = 1;i <= n;++i){
if (i == j)
continue;
double fac = a[i][j]/a[j][j];
for (int k = 1;k <= n+1;++k)
a[i][k] -= fac*a[j][k];
}
}
for (int i = 1;i <= n;++i){
x[i] = a[i][n+1]/a[i][i];
if (x[i] <= 0 || noint(x[i]) ){
nosol = true;
return;
}
if (x[i] > x[ans])
ans = i;
}
for (int i = 1;i <= n;++i){
if (ans == i)
continue;
if (x[ans] == x[i]){
nosol = true;
return ;
}
}
rans = ans;
}