码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1830 开关问题 高斯消元法

时间:2014-11-22 17:33:40      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:poj   c++   

开关问题
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 5854   Accepted: 2213

Description

有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)

Input

输入第一行有一个数K,表示以下有K组测试数据。 
每组测试数据的格式如下: 
第一行 一个数N(0 < N < 29) 
第二行 N个0或者1的数,表示开始时N个开关状态。 
第三行 N个0或者1的数,表示操作结束后N个开关的状态。 
接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。 

Output

如果有可行方法,输出总数,否则输出“Oh,it‘s impossible~!!” 不包括引号

Sample Input

2
3
0 0 0
1 1 1
1 2
1 3
2 1
2 3
3 1
3 2
0 0
3
0 0 0
1 0 1
1 2
2 1
0 0

Sample Output

4
Oh,it‘s impossible~!!


#include<iostream>
#include<cstring>
using namespace std;

const int l=35;
int u[l],v[l],n;
int a[l][l];

int gauss_elimination(){
    int i,j;
    for(i=0,j=0;i<n,j<n;j++){
        int k=i;
        for(;k<n;k++)
            if(a[k][j])  break;

        if(a[k][j]){
            int r;
            for(r=0;r<=n;r++)
                swap(a[i][r],a[k][r]);
            for(r=0;r<n;r++)
                if(a[r][j]&&r!=i)
                for(k=0;k<=n;k++)
                    a[r][k]^=a[i][k];
            i++;
        }
    }

    for(j=i;j<n;j++)
        if(a[j][n])   return -1;
    return 1<<(n-i);
}

int main(){
    int T;
    cin>>T;
    while(T--){
        cin>>n;
        memset(a,0,sizeof a);
        int i,j;
        for(i=0;i<n;i++) cin>>u[i];
        for(j=0;j<n;j++){
            cin>>v[j];
            a[j][n]=v[j]^u[j];
            a[j][j]=1;
        }

        int x,y;
        while(cin>>x>>y){
            if(x==0&&y==0)   break;
            a[y-1][x-1]=1;
        }

        int ans=gauss_elimination();
        if(ans==-1)
            cout<<"Oh,it's impossible~!!\n";
        else
            cout<<ans<<endl;
    }
    return 0;
}



poj 1830 开关问题 高斯消元法

标签:poj   c++   

原文地址:http://blog.csdn.net/hyccfy/article/details/41382649

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!