• 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!");
    }
    
  • 相关阅读:
    初来乍到
    windows小技巧:远程桌面连接rdp文件
    CSS小试牛刀
    Windows phone 7之样式与模板
    Pulldowntorefresh a WP7 ListBox or ScrollViewer(向上向下的手势)
    Windows Phone 7 文件下载进度和速度显示
    WPF Binding
    wp7学习笔记(转)
    WP7 网络请求之WebClient
    Windows Phone Tilt effect on HubTile and other Controls
  • 原文地址:https://www.cnblogs.com/-guz/p/9839432.html
Copyright © 2020-2023  润新知