poj 2947 Widget Factory(数学:高斯消元)

来源:互联网 发布:nodejs 官网cms 编辑:程序博客网 时间:2024/06/05 03:43

又是模板题。。。

直接套后来的加强版模板就可以了

建立m行n列的矩阵,并解对应方程

代码如下:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAXN 400using namespace std;int x[MAXN];int free_x[MAXN];int a[MAXN][MAXN];char sta[10], end[10];char str[][5] = {"MON", "TUE", "WED", "THU",            "FRI", "SAT", "SUN"};void print(int m, int n) {    for(int i=0; i<m; ++i) {        for(int j=0; j<=n; ++j)            printf("%d ", a[i][j]);        puts("");    }}int gcd(int a, int b) {    return b ? gcd(b, a%b) : a;}int lcm(int a, int b) {    return a/gcd(a, b)*b;}int gauss(int m, int n) {    int ta, tb, LCM, col;    int free_x_num, free_index;    int i, j, k, max_r, tmp;    for(int i=0; i<=n; ++i) {        x[i] = 0;        free_x[i] = true;    }    col = 0;    for(k=0; k<m&&col<n; ++k, ++col) {        max_r = k;        for(i=k+1; i<m; ++i) {            if(abs(a[i][col]) > abs(a[max_r][col]))                max_r = i;        }        if(max_r != k)            for(j=k; j<=n; ++j)                swap(a[k][j], a[max_r][j]);        if(a[k][col] == 0) {            --k;            continue;        }        for(i=k+1; i<m; ++i) {            if(a[i][col] != 0) {                LCM = lcm(abs(a[i][col]), abs(a[k][col]));                ta = LCM/abs(a[i][col]);                tb = LCM/abs(a[k][col]);                if(a[i][col] * a[k][col] < 0)                    tb = -tb;                for(j=col; j<=n; ++j)                    a[i][j] = ((a[i][j]*ta-a[k][j]*tb)%7+7)%7;            }        }    }    for(i=k; i<m; ++i)        if(a[i][col]) return -1;    if(k < n) {        for(i=k-1; i>=0; --i) {            free_x_num = 0;            for(j=0; j<n; ++j) {                if(a[i][j]!=0 && free_x[j])                    free_x_num++, free_index = j;            }            if(free_x_num > 1) continue;            tmp = a[i][n];            for(j=0; j<n; ++j) {                if(a[i][j] && j!=free_index)                    tmp -= a[i][j]*x[j]%7;                tmp = (tmp%7+7)%7;            }            x[free_index] = (tmp/a[i][free_index])%7;            free_x[free_index] = 0;        }        return  n-k;    }    for(i=n-1; i>=0; --i) {        tmp = a[i][n];        for(j=i+1; j<n; ++j) {            if(a[i][j]) {                tmp -= a[i][j]*x[j];            }            tmp = (tmp%7+7)%7;        }        while(tmp%a[i][i] != 0) tmp+=7;        x[i] = tmp/a[i][i]%7;    }    return 0;}int get_day(char s1[], char s2[]) {    int x, y;    for(int i=0; i<7; ++i) {        if(strcmp(s1, str[i]) == 0) {            x = i;            break;        }    }    for(int i=0; i<7; ++i) {        if(strcmp(s2, str[i]) == 0) {            y = i;            break;        }    }    int tmp = y+1-x;    return tmp;}int main(void) {    int m, n, k, nx;    while(scanf("%d%d", &n, &m) && (n||m)) {        memset(a, 0, sizeof(a));        for(int i=0; i<m; ++i) {            scanf("%d", &k);            scanf("%s%s", sta, end);            a[i][n] = (get_day(sta, end)%7+7)%7;            while(k--) {                scanf("%d", &nx);                --nx;                ++a[i][nx];                a[i][nx] %= 7;            }        }        //print(m, n);        int ans = gauss(m, n);        //print(m, n);        if(ans == -1) puts("Inconsistent data.");        else if(ans == 0){            for(int i=0; i<n; ++i)                if(x[i] < 3)                    x[i] += 7;            for(int i=0; i<n-1; ++i)                printf("%d ", x[i]);            printf("%d\n", x[n-1]);        }        else puts("Multiple solutions.");    }    return 0;}


0 0
原创粉丝点击