poj1830开关问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1830开关问题相关的知识,希望对你有一定的参考价值。
【题意】
与poj1222类似,只不过关系不再是通过矩阵体现,而是直接给出。
【题解】
根据关系建立出方程组,再高斯消元。若求出变元个数为num,答案即等于2^num。若解方程时有一个方程未知数系数为0,常数不为0,则是无解。
【代码】
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 struct node 6 { 7 int vec[31],c; 8 }a[31]; 9 int T,n,x,y,ans; 10 int gauss() 11 { 12 int po; 13 for (int i=1,o=1;o<=n;) 14 { 15 for (int j=i;j<=n;++j) 16 if (a[j].vec[o]) 17 { 18 swap(a[i],a[j]); 19 break; 20 } 21 if (!a[i].vec[o]) 22 { 23 ++o; 24 continue; 25 } 26 for (int j=i+1;j<=n;++j) 27 if (a[j].vec[o]) 28 { 29 if (a[i].c) a[j].c^=1; 30 for (int k=o;k<=n;++k) 31 if (a[i].vec[k]) a[j].vec[k]^=1; 32 } 33 ++i;++o;po=i; 34 } 35 ans=1; 36 for (int i=po;i<=n;++i) 37 if (a[i].c) return -1; 38 else ans<<=1; 39 return ans; 40 } 41 int main() 42 { 43 scanf("%d",&T); 44 while (T--) 45 { 46 scanf("%d",&n); 47 memset(a,0,sizeof(a)); 48 for (int i=1;i<=n;++i) scanf("%d",&a[i].c); 49 for (int i=1;i<=n;++i) 50 { 51 scanf("%d",&x); 52 a[i].c^=x; 53 a[i].vec[i]=1; 54 } 55 while(1) 56 { 57 scanf("%d%d",&x,&y); 58 if (!x||!y) break; 59 a[y].vec[x]=1; 60 } 61 ans=gauss(); 62 if (ans==-1) puts("Oh,it‘s impossible~!!"); 63 else printf("%d\n",ans); 64 } 65 return 0; 66 }
以上是关于poj1830开关问题的主要内容,如果未能解决你的问题,请参考以下文章