題意:經典的精確覆蓋問題。
思路:精確覆蓋問題是npc的,用dlx能夠比較有效的搜尋。寫完兩個數獨再寫這個就不難了(實際上這個是原始問題,數獨只是dlx的應用)。
#include #include #define n 16
#define m 300
struct nodep[n*m+m+5];
int s[n+5][m+5];
int n,m,top,cnt[m];
void init()
p[0].l = m;
p[m].r = 0;
top = m;
}void add(int l,int i,int j)
void del(int c)
}}void re(int c)
}int dfs()
del(c);
for(i = p[c].d;i!=c;i=p[i].d)
re(c);
return 0;
}int main()
}for(i = 1;i<=n;i++)
for(j = first = 1;j<=m;j++)
if(s[i][j])else
add(top, i, j);
}if(dfs())
printf("yes, i found it\n");
else
printf("it is impossible\n");
}return 0;
}
POJ 3740 精確覆蓋問題,DLX模版
花3小時打上的注釋,分享給大家。1 include 2 include 3 const int maxr 20 4 const int maxc 310 5 const int maxn maxr maxc maxc 6const int inf maxr 10 7 8int n,m 9int l ...
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過程 很容易想到上面的搜尋,但是狀態的改變很難操作,包括了刪除和復原,使用普通的資料結構運算根本停不下來。於是,一位大師想到了神奇的資料結構...