博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dfs【p4906】小奔关闹钟
阅读量:4701 次
发布时间:2019-06-09

本文共 2090 字,大约阅读时间需要 6 分钟。

Background

由于今天是星期一,闹钟准时响了,由于小奔太困了,所以她想关停闹钟。

Description

可是,他的闹钟电路太复杂了,有很多个开关,每个开关都连着其他开关,其他开关又连着更多的开关,当且仅当所有开关都关闭时,闹钟才会停止响铃,(初始时默认每个开关都开着的),她该如何是好呢?

请你帮小奔求出最少开关次数,如果无论如何都不能关闭闹钟,请输出‘Change an alarm clock,please!’

Input

共有N+1行

第一行一个数N(1≤N≤20),表示有N个开关,从第2行起的第i行表示第i个闹钟开关。

以后N行,每行第一个数为M(0≤M≤N-1),表示第i个闹钟开关的直接关联开关个数。(由直接关联开关所关联的直接关联开关,自然就是第i个闹钟间接关联开关啦,当打开第i个开关时,只有直接关联,间接关联以及第i个开关才会起作用。),之后M个数,表示第i个闹钟直接关联开关的标号。(如果M为0则表示没有任何关联)

Output

一个数ans,表示最少按开关次数,如果无法关闭,输出‘Change an alarm clock,please!’

其实没有看题.多亏ZAGER概括题意

给你一些开关,这些开关能控制其他开关,而这些开关又能控制其他开关,总共有三层.

直接暴力搜索,判断能否使得所有闹钟被关掉.

注意重边和自环的影响.

代码

#include
#include
#include
#define R registerusing namespace std;inline void in(int &x){ int f=1;x=0;char s=getchar(); while(!isdigit(s)){if(s=='-')f=-1;s=getchar();} while(isdigit(s)){x=x*10+s-'0';s=getchar();} x*=f;}bool ok[25][25],open[25];int head[108],tot,ans=2147483644,n;struct cod{int u,v;}edge[1088];inline bool check(){ for(R int i=1;i<=n;i++) if(open[i])return false; return true;}inline void add(int x,int y){ edge[++tot].u=head[x]; edge[tot].v=y; head[x]=tot;}void dfs(int dep,int now){ if(now>=ans)return; if(dep>n) { if(check()) ans=min(ans,now); return; } dfs(dep+1,now); open[dep]^=1; for(R int i=head[dep];i;i=edge[i].u) { open[edge[i].v]^=1; for(R int j=head[edge[i].v];j;j=edge[j].u) open[edge[j].v]^=1; } dfs(dep+1,now+1); open[dep]^=1; for(R int i=head[dep];i;i=edge[i].u) { open[edge[i].v]^=1; for(R int j=head[edge[i].v];j;j=edge[j].u) open[edge[j].v]^=1; } }int main(){ in(n); for(R int i=1,m;i<=n;i++) { in(m);open[i]=true; for(R int j=1,x;j<=m;j++) in(x),ok[i][x]=true; } for(R int i=1;i<=n;i++) for(R int j=1;j<=n;j++) if(ok[i][j] and i!=j) add(i,j); dfs(1,0); if(ans!=2147483644)printf("%d",ans); else puts("Change an alarm clock,please!");}

转载于:https://www.cnblogs.com/-guz/p/9839432.html

你可能感兴趣的文章
No Link, Cut Tree! Gym - 101484F(dp)
查看>>
Coprimes Gym - 101492C(bitset)
查看>>
Partial Tree UVALive - 7190(完全背包)
查看>>
『深度应用』NLP机器翻译深度学习实战课程·零(基础概念)
查看>>
『开发技术』Windows极简安装使用face_recognition实现人脸识别
查看>>
『深度应用』NLP命名实体识别(NER)开源实战教程
查看>>
『开发技术』GPU训练加速原理(附KerasGPU训练技巧)
查看>>
『深度应用』NLP机器翻译深度学习实战课程·壹(RNN base)
查看>>
『深度应用』一小时教你上手MaskRCNN·Keras开源实战(Windows&Linux)
查看>>
『王霸之路』从0.1到2.0一文看尽TensorFlow奋斗史
查看>>
系统测试中需要注意的点
查看>>
Elasticsearch TermQuery 详解
查看>>
一个困扰了我N久的bug , android.enableAapt2=false 无效
查看>>
查看客户端的IP地址,机器名,MAC地址,登陆名等信息
查看>>
移动端经常遇到的小bug
查看>>
网络&热恋NSURLConnection代理及GET¥POST请求
查看>>
SshTerminal
查看>>
MySQL常用函数
查看>>
Ubuntu安装搜狗拼音教程
查看>>
Happy Number
查看>>