首页 > 其他 > 详细

poj1830 开关问题

时间:2018-03-07 10:13:35      阅读:161      评论:0      收藏:0      [点我收藏+]


\(a_{i,j}\) 表示第 \(j\) 个开关对第 \(i\) 号开关产生的影响,\(x_i\) 为对第 \(i\) 个开关的操作,则
\[\begin{cases} a_{1,1}x_1\ \mathrm{xor}\ a_{1,2}x_2\ \mathrm{xor}\ \cdots\ \mathrm{xor}\ a_{1,n}x_n=start_1 \ \mathrm{xor}\ end_1 \a_{2,1}x_1\ \mathrm{xor}\ a_{2,2}x_2\ \mathrm{xor}\ \cdots\ \mathrm{xor}\ a_{2,n}x_n=start_2 \ \mathrm{xor}\ end_2 \\cdots \a_{n,1}x_1\ \mathrm{xor}\ a_{n,2}x_2\ \mathrm{xor}\ \cdots\ \mathrm{xor}\ a_{n,n}x_n=start_n \ \mathrm{xor}\ end_n \\end{cases}\]
解就是了

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int T, a[35], sta, end, n, uu, vv;
int gauss(){
    for(int i=1; i<=n; i++){
        int maxi=i;
        for(int j=i+1; j<=n; j++)
            if(a[j]>a[maxi])
                maxi = j;
        swap(a[maxi], a[i]);
        if(a[i]==0) return 1<<(n-i+1);
        if(a[i]==1) return -1;
        for(int j=n; j; j--)
            if(a[i]&(1<<j)){
                for(int k=1; k<=n; k++)
                    if(k!=i && a[k]&(1<<j))
                        a[k] ^= a[i];
                break;
            }
    }
    return 1;
}
int main(){
    cin>>T;
    while(T--){
        memset(a, 0, sizeof(a));
        sta = end = 0;
        scanf("%d", &n);
        for(int i=1; i<=n; i++){
            scanf("%d", &uu);
            a[i] ^= uu;
        }
        for(int i=1; i<=n; i++){
            scanf("%d", &uu);
            a[i] ^= uu;
            a[i] |= 1<<i;
        }
        while(scanf("%d %d", &uu, &vv)!=EOF){
            if(!uu && !vv)  break;
            a[vv] |= 1<<uu;
        }
        int re=gauss();
        if(re<0)    printf("Oh,it‘s impossible~!!\n");
        else    printf("%d\n", re);
    }
    return 0;
}

poj1830 开关问题

原文:https://www.cnblogs.com/poorpool/p/8520357.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!