[Usaco2009 Nov]lights(高斯消元)

Posted rikurika

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Usaco2009 Nov]lights(高斯消元)相关的知识,希望对你有一定的参考价值。

luogu

点灯游戏应该很多人都在小时候頽过吧

反正我直到现在也不会

很明显一个灯最多只需要点一次

然后高斯消元

解完肯定剩自由元(就是那些全是0的行)

然后这些都爆搜

由于剩下的自由元不会太多

所以时间复杂度$O(能过)$

以上

技术图片
 1 #include<cstdio>
 2 #include<algorithm>
 3 using std::swap;
 4 const int N=40;
 5 template<typename tp>void read(tp &kk)
 6     tp ret=0,f=1;char ch=getchar();
 7     while(ch<0||ch>9)if(ch==-)f=-1;ch=getchar();
 8     while(ch>=0&&ch<=9)ret=ret*10+ch-0;ch=getchar();
 9     kk=ret*f;
10 
11 int n,a[N][N];
12 
13 
14 void gauss()
15 
16     for(int l=1;l<=n;l++)
17     
18         int g=l;
19         while(g<=n&&(!a[g][l])) g++;
20         if(g>n) continue;
21         if(l!=g)
22             for(int i=l;i<=n+1;i++) swap(a[l][i],a[g][i]);
23         for(int i=1;i<=n;i++)
24         
25             if(a[i][l]&&i!=l)
26             
27                 for(int j=l;j<=n+1;j++) a[i][j]^=a[l][j];
28             
29         
30     
31 
32 
33 int ans;
34 void wtf(int l,int x)
35 
36     if(x>ans) return;
37     if(!l)ans=x;return;
38     if(a[l][l]) wtf(l-1,x+a[l][n+1]);
39     else
40     
41         if(a[l][n+1]) return;
42         wtf(l-1,x);
43         for(int i=l-1;i;i--) a[i][n+1]^=a[i][l];
44         wtf(l-1,x+1);
45         for(int i=l-1;i;i--) a[i][n+1]^=a[i][l];
46     
47 
48 int m,xi,yi;
49 int main()
50 
51     read(n),read(m);
52     for(int i=1;i<=n;i++) a[i][i]=a[i][n+1]=1;
53     for(int i=1;i<=m;i++)
54     
55         read(xi),read(yi);
56         a[xi][yi]^=1,a[yi][xi]^=1;
57     
58     gauss();
59     ans=n;
60     wtf(n,0);
61     printf("%d\n",ans);
62     return 0;
63 
orz

 

以上是关于[Usaco2009 Nov]lights(高斯消元)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)

P2962 [USACO09NOV]Lights G(dfs&高斯消元)

bzoj 1770 [Usaco2009 Nov]lights 燈 meet in the middle

luogu2962 [USACO09NOV]灯Lights

灯Lights[USACO09NOV]

BZOJ 1770: [Usaco2009 Nov]lights 燈