程序输出无解,但数据其实是有解的,没看出哪里错了,求大佬帮忙看看。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int N=501;
double lst[N][N];
double a[N][N];
int n;
void init(int line){
memset(a,0,sizeof(a));
int ok=1;
for(int i=1;i<=n+1;i++){
if(i==line) continue;
for(int j=1;j<=lst[i][0];j++){
a[ok][(int)lst[i][j]]++;
}
a[ok][n+1]=lst[i][(int)(lst[i][0]+1)];
ok++;
}
}
int pd(int x){
if(floor(x)==x) return 0;
else return 1;
}
int gause(){
int ok=1;
for(int i=1;i<=n;i++){
int pos=ok;
for(int j=ok+1;j<=n;j++){
if(fabs(a[j][i])>fabs(a[pos][i])) pos=j;
}
if(a[pos][i]==0) continue;
for(int j=1;j<=n+1;j++) swap(a[ok][j],a[pos][j]);
for(int j=1;j<=n;j++){
if(j!=ok){
double tmp=a[j][i]/a[ok][i];
for(int k=i+1;k<=n+1;k++){
a[j][k]-=a[ok][k]*tmp;
}
}
}
ok++;
}
if(ok<=n) return 0;
else{
double maxn=0,maxtot=0,maxk;
for(int i=1;i<=n;i++){
if(pd(a[i][n+1]/a[i][i]) || (a[i][n+1]/a[i][i])<=0) return 0;
if(a[i][n+1]/a[i][i]>maxn){
maxn=a[i][n+1]/a[i][i];
maxk=i;
maxtot=1;
}
else if(a[i][n+1]/a[i][i]==maxn) maxtot++;
}
if(maxtot>1) return 0;
else return maxk;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n+1;i++){
scanf("%lf",&lst[i][0]);
for(int j=1;j<=lst[i][0]+1;j++){
scanf("%lf",&lst[i][j]);
}
}
int flg=0,ans=0;
for(int i=1;i<=n+1;i++){
init(i);
int tmp=gause();
if(ans && tmp){
printf("illegal\n");
return 0;
}
else if(tmp) ans=tmp;
}
if(ans) printf("%d\n",ans);
else printf("illegal\n");
return 0;
}
希望不是一些弱智错误……