Dfs p4906 小奔關鬧鐘

2022-05-27 16:15:12 字數 1488 閱讀 1216

由於今天是星期一,鬧鐘準時響了,由於小奔太睏了,所以她想關停鬧鐘。

可是,他的鬧鐘電路太複雜了,有很多個開關,每個開關都連著其他開關,其他開關又連著更多的開關,當且僅當所有開關都關閉時,鬧鐘才會停止響鈴,(初始時預設每個開關都開著的),她該如何是好呢?

請你幫小奔求出最少開關次數,如果無論如何都不能關閉鬧鐘,請輸出『change an alarm clock,please!』

共有n+1行

第一行乙個數n(1≤n≤20),表示有n個開關,從第2行起的第i行表示第i個鬧鐘開關。

以後n行,每行第乙個數為m(0≤m≤n-1),表示第i個鬧鐘開關的直接關聯開關個數。(由直接關聯開關所關聯的直接關聯開關,自然就是第i個鬧鐘間接關聯開關啦,當開啟第i個開關時,只有直接關聯,間接關聯以及第i個開關才會起作用。),之後m個數,表示第i個鬧鐘直接關聯開關的標號。(如果m為0則表示沒有任何關聯)

乙個數ans,表示最少按開關次數,如果無法關閉,輸出『change an alarm clock,please!』

其實沒有看題.多虧zager概括題意

給你一些開關,這些開關能控制其他開關,而這些開關又能控制其他開關,總共有三層.

直接暴力搜尋,判斷能否使得所有鬧鐘被關掉.

注意重邊和自環的影響.

**

#include#include#include#define r register

using namespace std;

inline void in(int &x)

while(isdigit(s))

x*=f;

}bool ok[25][25],open[25];

int head[108],tot,ans=2147483644,n;

struct codedge[1088];

inline bool check()

inline void add(int x,int y)

void dfs(int dep,int now)

dfs(dep+1,now);

open[dep]^=1;

for(r int i=head[dep];i;i=edge[i].u)

dfs(dep+1,now+1);

open[dep]^=1;

for(r int i=head[dep];i;i=edge[i].u)

}int main()

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!");

}

Jzoj4906 組合數問題

題意 noip2016d2t1 我們考慮將每個數字質因數分解來做即可 線性篩求出所有2000以內的質數讓後直接暴力分解即可,計算c i,j 是否為k的倍數,最後加上字首和 include include int w 500 c 0,n,m,t,k,pr 2010 int l 2010 f 2010 ...

Jzoj4906 組合數問題

題意 noip2016d2t1 我們考慮將每個數字質因數分解來做即可 線性篩求出所有2000以內的質數讓後直接暴力分解即可,計算c i,j 是否為k的倍數,最後加上字首和 include include int w 500 c 0,n,m,t,k,pr 2010 int l 2010 f 2010 ...

Dfs P2052 NOI2011 道路修建

在 w 星球上有 n 個國家。為了各自國家的經濟發展,他們決定在各個國家 之間建設雙向道路使得國家之間連通。但是每個國家的國王都很吝嗇,他們只願 意修建恰好 n 1條雙向道路。每條道路的修建都要付出一定的費用,這個費用等於道路長度乘以道路兩端的國家個數之差的絕對值。例如,在下圖中,虛線所示道路兩端分...