zoukankan      html  css  js  c++  java
  • POJ 1830 开关问题 高斯消元

      题目链接: http://poj.org/problem?id=1830

      题目描述: 给出开关的初始, 末状态, 再给出互相影响的开关关系, 输出有几种方式可以从初始到结束状态

      解题思路: 这是个高斯消元题.....题单可能是放错了吧.....解的个数为2^(自由变元的个数)

      代码:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iterator>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <map>
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    #define mem0(a) memset(a,0,sizeof(a))
    #define sca(x) scanf("%d",&x)
    #define de printf("=======
    ")
    typedef long long ll;
    using namespace std;
    
    const int maxn = 40;
    int a[maxn][maxn];;
    int n;
    int s[maxn];
    int e[maxn];
    
    int gauss() {
        int i;
        int j;
        for( i = 1, j = 1; i <= n && j <= n; j++ ) {
            
                int k = i;
                for( k = i; k <= n; k++ ) {
                    if( a[k][j] ) break;
                }
                if( a[k][j] ) {
                    for( int r = 1; r <= n+1; r++ ) {
                        swap(a[i][r], a[k][r]);
                    }
                    for( int r = 1; r <= n; r++ ) {
                        if( r != i && a[r][j] ) {
                            for( int k = 1; k <= n+1; k++ ) {
                                a[r][k] ^= a[i][k];
                            }
                        }
                    }
                    i++;
                }
            
        }
        for( int j = i; j <= n; j++ ) {
            if( a[j][n+1] ) return -1;
        }
        return 1<<(n-i+1);
    }
    int main() {
        int t;
        sca(t);
        while( t-- ) {
            sca(n);
            mem0(a);
            for( int i = 1; i <= n; i++ ) {
                sca(s[i]);
            }
            for( int i = 1; i <= n; i++ ) {
                sca(e[i]);
                a[i][n+1] = s[i] ^ e[i];
                a[i][i] = 1;
            }
            int x, y;
            while( scanf( "%d%d", &x, &y ) && x+y ) {
                a[y][x] = 1;
            }
            int ans = gauss();
            if( ans == -1 ) {
                printf( "Oh,it's impossible~!!
    " );
            }
            else {
                printf( "%d
    ", ans );
            }
        }
    }
    View Code

      思考: 有空应该回顾一下高斯消元和fft这种模板的, 等我这两个专题刷完的吧, 不复习有点儿忘了感觉.....是时候应该学习高数了......

  • 相关阅读:
    彼之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践
    WebAPI框架里设置异常返回格式统一
    Entity Framework Plus
    实体框架自定义代码优先约定(EF6以后)
    npm 切换淘宝镜像几种方式
    EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json
    Json序列化循环引用的问题
    Windows Service 之 安装失败后的删除
    Windows Service 之 详解(二)
    Windows Service 之 详解(一)
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/7445185.html
Copyright © 2011-2022 走看看