Dfs【p4906】小奔关闹钟

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<cstdio>
#include<cctype>
#include<iostream>
#define R register
using 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

时间: 2025-01-17 13:47:34

Dfs【p4906】小奔关闹钟的相关文章

P4906 小奔关闹钟

${\color{Cyan}{>>Question}}$ 一道水题 注意题中只要求扩展两层以内的开关 所以预处理出按了开关的影响,利用异或的性质就能很好地解决 然后$dfs$时枚举每个开关按或不按(因为即使再按也是相同的情况) 就没了$?$ 没了 代码如下 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #define

hdu 2821 学习一点dfs的小技巧吧。。 还是自己太弱了

#include<iostream> #include<cstdio> #include<cstring> using namespace std; int r,c,s,flag; int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; char mapp[25][25],road[1000],d[5] = {"DURL"}; bool check(int x,int y) { if(x < 0 || x &g

Win10 Mobile一周年更新:微软小娜关不掉

9月30日消息,微软即将推送Win10一周年更新RTM版,目前Insider的最新版本为14393.5,在这一版本中,我们发现微软对小娜语音助手的设置做了一些小改动. 简单来说,小娜语音助手设置中的关闭选项被移除了.在此前版本中(具体哪个版本被正式移除目前尚未明确)娱 乐 城可以通过设置中的关闭选项来停用微软小娜语音助手,然而本次改动之后,微软小娜将默认处于启用状态. 不过小娜并没有强制用户登陆自己的账号,这意味着其收集的个人资料并没有与用户账户绑定,然而对于许多用户来说,自己的隐私很难保全.欧

[ZOJ 1008]Gnome Tetravex (dfs搜索 + 小优化)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008 题目大意:给你n*n的矩阵,每个格子里有4个三角形,分别是上右下左,每个三角形里面标记了数字,问你能否通过移动这n*n个格子,使得相邻两个三角形具有相同的数字? dfs暴搜,dfs(x,y)代表当前要放(x,y)这个位置. 然后枚举给定的每个格子. 如果说可以放,就dfs下一个格子. 这一道题需要把相同的格子压缩起来,也就是说为了节省时间,可以记录相同的格

闹钟使用技巧

闹钟使用技巧       你是否曾经睡醒的时候感觉昏昏沉沉? 你是否曾经因为经常睡过头浪费了宝贵的时间而懊恼? 你是否曾经在闹钟响了几次之后都依旧没起来? 如果是,那么这篇文章或许你帮助你. 1.人的睡眠规律        想要获得良好的休息,就必须借助科学对于睡眠研究的理论.但仅仅只有理论是完全不够的,我们还需要想办法把它运用到实际中. 因此我们首要要来看看这副睡眠周期图: 在我们的睡眠中,分为深度睡眠和浅度睡眠两种状态.在浅度睡眠中,人容易被唤醒,而且只需较短的时间能够迅速清醒.而在深度睡眠

UVa 208 消防车(dfs+剪枝)

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=144 题意:给出一个n个结点的无向图以及某个结点k,按照字典序从小到大顺序输出从1到结点k的所有路径. 思路:如果直接矩阵深搜的话是会超时的,所以我们可以从终点出发,将与终点相连的连通块保存起来,这样dfs深搜时可以剪枝掉一些到达不了的点.只要解决了这个,dfs就是小问题. 这道题还有点坑的

CodeForces Gym 100500A A. Poetry Challenge DFS

Problem A. Poetry Challenge Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/attachments Description Let’s check another challenge of the IBM ICPC Chill Zone, a poetry challenge. One says a poetry string that starts with a

关于微软小娜Cortana(安卓版)

关于微软小娜,大家都知道是微软发布的全球第一款个人智能助理.它"能够了解用户的喜好和习惯","帮助用户进行日程安排.问题回答等".今天我就向大家介绍一下安卓版的小娜. 首先,和电脑版的小娜一样,安卓版小娜也需要通过微软账号登录,登陆后的主界面是这样的:                          它的主体是一个可以左右切换的窗口,第一个窗口主要显示你当前位置的天气情况.还有今天和未来几天的提醒和行程安排.第二个窗口可以让你预设一些日程安排并对这些日程安排进行管

[HDU 5296] Annoying problem (DFS序性质+LCA)

HDU - 5296 一棵树上有若干个点,每条边有一个边权 给一个初始为空的集合,每次向集合内添加一个点或者删除一个点 问每次操作结束后,将集合内所有点连起来的边权和为多少 假设集合内已经有一些点,那么再加一个点所增加的边权 将会是这个点到某一条链的距离 但是这条链不能随便挑选,否则可能会经过已经选择的边 挑选策略就是,找到集合内dfs序比当前点大和小的两个点组成的链 换句话来说,就是集合内dfs序最靠近当前点的两个点 设当前点 x,这样选链,选出的链是 (u,v),并且设dfsn[u]<dfs