跳转至

高斯消元

例题

P3389 【模板】高斯消元法 - 洛谷

代码
C++
const double eps = 1e-8;
int main() {
    int n;
    cin >> n;
    vector a(n + 2, vector(n + 2, 0.0));
    for (int i = 1 ; i <= n ; i++) {
        for (int j = 1 ; j <= n + 1 ; j++) {
            cin >> a[i][j];
        }
    }
    for (int i = 1 ; i <= n ; i++) {
        int mx = i;
        for (int j = i + 1 ; j <= n ; j++) {
            if (fabs(a[j][i]) > fabs(a[mx][i])) {
                mx = j;
            }
        }
        if (fabs(a[mx][i]) < eps) {
            cout << "No Solution";
            return 0;
        }
        swap(a[i], a[mx]);
        double t = a[i][i];
        for (int j = i ; j <= n + 1 ; j++) {
            a[i][j] /= t;
        }
        for (int j = i + 1 ; j <= n ; j++) {
            t = a[j][i];
            for (int k = i ; k <= n + 1 ; k++) {
                a[j][k] -= a[i][k] * t;
            }
        }
    }
    vector<double> ans(n + 1);
    ans[n] = a[n][n + 1];
    for (int i = n - 1 ; i >= 1 ; i--) {
        ans[i] = a[i][n + 1];
        for (int j = i + 1 ; j <= n ; j++) {
            ans[i] -= a[i][j] * ans[j];
        }
    }
    for (int i = 1 ; i <= n ; i++) {
        cout << fixed << setprecision(2) << ans[i] << "\n";
    }
    return 0;
}

P2447 [SDOI2010] 外星千足虫 - 洛谷

代码
C++
bitset<1005> a[2005];
int n, m;
int gauss() {
    int mx = 0;
    for (int i = 0 ; i < n ; i++) {
        int cur = i;
        for (int j = i ; j < m ; j++) {
            if (a[j][i] == 0) continue;
            cur = j;
            break;
        }
        if (a[cur][i] == 0) return 0;
        swap(a[i], a[cur]);
        mx = max(mx, cur);
        for (int j = 0 ; j < m ; j++) {
            if (i == j) continue;
            if (a[j][i]) {
                a[j] ^= a[i];
            }
        }
    }
    return mx + 1;
}
int main() {
    cin >> n >> m;
    for (int i = 0 ; i < m ; i++) {
        string s;
        cin >> s;
        for (int j = 0 ; j < n ; j++) {
            a[i][j] = s[j] - '0';
        }
        int x;
        cin >> x;
        a[i][n] = x;
    }
    int ret = gauss();
    if (ret) {
        cout << ret << "\n";
        for (int i = 0 ; i < n ; i++) {
            cout << (a[i][n] ? "?y7M#" : "Earth") << "\n";
        }
    } else {
        cout << "Cannot Determine";
    }
    return 0;
}