oyjpArt ACM/ICPC算法程序设计空间

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

高斯消元

Posted on 2007-05-28 19:26 oyjpart 阅读(2373) 评论(0)  编辑 收藏 引用 所属分类: ACM/ICPC或其他比赛

一直都没写过高斯消元 今天数值分析老师说要写一个交上去 我就写了一个 呵呵
//by OyjpArt 
//使用方法:
//ok = 0;
//solve(0);

const int N = 1010;
double mat[N][N]; //增广矩阵
double ans[N];
int n; //未知数个数
const double EPS = 1e-7;
bool ok;

int dblcmp(double a) { if(fabs(a) < EPS) return 0; if(a < 0) return -1; return 1; }

void solve(int x) {
 if(x == n-1) {
  if(dblcmp(mat[x][x]) == 0) ok = 0;
  else ans[x] = mat[x][x+1] / mat[x][x];
  return;
 }
 int i, j;
 for(i = x; i < n && dblcmp(mat[i][x]) == 0; i++);
 if(i == n) { ok = 0; return; }
 if(i != x) {
  double tmp[N];
  memcpy(tmp, mat[x], (n+1) * sizeof(double));
  memcpy(mat[x], mat[i], (n+1) * sizeof(double));
  memcpy(mat[i], tmp, (n+1) * sizeof(double));
 }
 for(i = x+1; i < n; i++) {
  if(dblcmp(mat[i][x]) == 0) continue;
  double m = mat[x][x] / mat[i][x];
  for(j = x; j < n + 1; j++)
   mat[i][j] = mat[i][j] * m - mat[x][j];
 }
 solve(x+1);
 double sum = mat[x][n];
 for(i = x+1; i < n; i++) sum -= mat[x][i] * ans[i];
 ans[x] = sum / mat[x][x];
}


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理