记录编号 |
238145 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2013]开关控制 |
最终得分 |
100 |
用户昵称 |
liu_runda |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.015 s |
提交时间 |
2016-03-18 17:59:01 |
内存使用 |
0.29 MiB |
显示代码纯文本
- #include<cstdio>
- bool l[50][50];int n,m;
- void Xor(int a,int b){
- for(int i=1;i<=n+1;++i)l[a][i]^=l[b][i];
- }
- void swap(int a,int b){
- for(int i=1;i<=n+1;++i)l[a][i]^=l[b][i]^=l[a][i]^=l[b][i];
- }
- void xiaoyuan(){
- for(int i=1;i<n;++i){
- if(!l[i][i]){
- for(int j=i+1;j<=n;++j){
- if(l[j][i]){
- swap(i,j);
- break;
- }
- }
- }
- for(int j=i+1;j<=n;++j)if(l[j][i])Xor(j,i);
- }
- }
- int ans=1<<20,now=0;
- void dfs(int x){
- if(now>ans)return;
- if(x==0){
- if(now<ans)ans=now;
- return;
- }
- if(l[x][x]){//注意这时候第x盏灯未必要被按下。。。要考虑常数项的变化
- int tmp=l[x][n+1];
- for(int i=x-1;i>0;--i){
- if(l[i][x])l[i][n+1]^=tmp;
- }
- now+=tmp;
- dfs(x-1);
- now-=tmp;
-
- for(int i=x-1;i>0;--i){
- if(l[i][x])l[i][n+1]^=tmp;
- }
- }
- else{
- //假想这个变量为1
- for(int i=x-1;i>0;--i){
- if(l[i][x])l[i][n+1]^=1;
- }
- now++;
- dfs(x-1);
- now--;
- //恢复
- for(int i=x-1;i>0;--i){
- if(l[i][x])l[i][n+1]^=1;
- }
- //假想这个变量为0
- dfs(x-1);
- }
- }
- int main(){
- freopen("haoi13t3.in","r",stdin);
- freopen("haoi13t3.out","w",stdout);
- scanf("%d %d",&n,&m);
- int a,b;
- while(m--){
- scanf("%d %d",&a,&b);
- l[a][b]=l[b][a]=true;
- }
- for(int i=1;i<=n;++i)l[i][i]=true;
- for(int i=1;i<=n;++i)l[i][n+1]=true;
- xiaoyuan();
- dfs(n);
- printf("%d\n",ans);
- fclose(stdin);fclose(stdout);
- return 0;
- }
- /*
- 16 45
- 7 8
- 4 15
- 11 9
- 12 7
- 16 10
- 6 11
- 5 9
- 4 12
- 10 4
- 15 12
- 1 6
- 6 13
- 7 15
- 6 5
- 4 14
- 11 10
- 13 8
- 1 14
- 3 12
- 7 2
- 4 6
- 16 1
- 10 8
- 10 15
- 2 4
- 16 9
- 10 1
- 14 6
- 16 6
- 13 1
- 8 16
- 9 10
- 3 2
- 10 7
- 14 15
- 4 9
- 14 10
- 5 16
- 3 5
- 9 12
- 16 2
- 12 6
- 13 9
- 3 11
- 12 16
-
- output:8
- */