題意:
有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之前,為什麼呢?因為我們...