int find(){ LDB maxi=-1e15;int po; for (int i=1;i<=ycnt;i++) if (ans[i]>maxi){ maxi=ans[i];po=i; } if (maxi<eps) return(0); int tar=po;maxi=1e15; for (int i=1;i<=xcnt;i++) if ((lim[i][tar])>eps&&lim[i][0]/lim[i][tar]<maxi){ maxi=lim[i][0]/lim[i][tar];po=i; } if (maxi==1e15){ ans[0]=-1e12;return(0); } for (int i=0;i<=ycnt;i++){ LDB t=lim[po][i];lim[po][i]=lim[1][i];lim[1][i]=t; } return(tar); } void work(){ while (int po=find()){ for (int i=2;i<=xcnt;i++) if (fabs(lim[i][po])>eps){ LDB bas=lim[i][po]/lim[1][po]; lim[i][po]=0; for (int j=0;j<=ycnt;j++) lim[i][j]-=lim[1][j]*bas; } LDB bas=ans[po]/lim[1][po]; ans[po]=0; for (int j=0;j<=ycnt;j++) ans[j]-=lim[1][j]*bas; } }
注意po那一列需要消2倍