DLX反覆覆蓋 hdu 2828 Lamp

2021-09-07 11:56:15 字數 1094 閱讀 7643

題意:

有n個燈m個開關

每乙個燈的on和off狀態都能控制乙個燈是否亮

給出n行,代表對於每乙個燈

哪些開關的哪個狀態能夠使得第i個燈亮

思路:這裡須要注意乙個問題 

假設開關1的on 狀態和開關2的on狀態能使得1號燈亮

那麼開關1、2同一時候處於on的時候 1號燈也是亮的。意思就是僅僅要有乙個開關使得燈亮,燈就亮了。

簡單的dlx 反覆覆蓋

行為每乙個開關的兩個狀態2*m行,列為n個燈

在搜尋的同一時候標記一下哪個開關被用過了

那麼還有乙個狀態也不能用了

**:#include"stdio.h"

#include"algorithm"

#include"string.h"

#include"iostream"

#include"queue"

#include"map"

#include"vector"

#include"string"

using namespace std;

#define n 1005*1005

#define rn 1005

#define cn 1005

int us[rn];

struct dlx

c=m; for(int i=1; i<=n; i++) h[i]=-1; } void link(int x,int y) } void del(int x) } void rec(int x) } int used[cn]; int h() } return sum; } int dance(int x) int now=r[0]; for(int i=r[0]; i!=0; i=r[i]) for(int i=d[now]; i!=now; i=d[i]) } return 0; } } dlx; int main() } memset(us,0,sizeof(us)); int f=dlx.dance(0); if(f==0) puts("-1"); else for(int i=1;i<=m;i++) printf(i==m?"%s\n":"%s ",us[i]==0?"off":"on"); } } return 0; }

DLX 精確覆蓋 重複覆蓋

給定乙個n m的矩陣,有些位置為1,有些位置為0。如果g i j 1則說明i行可以覆蓋j列。problem 1 選定最少的行,使得每列有且僅有乙個1.2 選定最少的行,使得每列至少乙個1.這類屬於np問題的問題,可以使用搜尋解決。但是普通的搜尋必超時無疑。因此我們要設法加優化來加快速度。dancin...

DLX 精確覆蓋問題

精確覆蓋問題 給定乙個由0 1組成的矩陣,問是否能找到乙個行的集合,使得集合中每一列都恰好包含乙個1 如圖 演算法x 通過dfs,每次選取一行可行 模擬演算法x過程 很容易想到上面的搜尋,但是狀態的改變很難操作,包括了刪除和復原,使用普通的資料結構運算根本停不下來。於是,一位大師想到了神奇的資料結構...

SPOJ 1771 DLX精確覆蓋,重複覆蓋

dlx的題,做過這題才算是會吧。這道題轉化成了精確覆蓋模型來做,一開始,只是單純的要覆蓋完行列和斜線,wa。後來醒悟了,不能這樣,只要覆蓋全部行或列即可。雖然如此,但某些細節地方很關鍵不能考慮到。特別要注意的是 for int i r c i i r i 找最小值只能是在ne之前,為什麼呢?因為我們...