///定義(ctrl+c):
/*(1)歷史:
x演算法是高德納提出的解決精確覆蓋問題的演算法,而dancing links x演算法則是donknuth(《計算機程式設計藝術》
的作者)提出的對x演算法的一種高效實現,這種實現建立在如上所說的矩陣表示法上。
(2)演算法思想:
由如上精確覆蓋問題的矩陣表示法中,我們知道dancing links x 是用來求解乙個 01矩陣中選取哪幾行可以使得
這幾行每一列都有且僅有乙個1(就是每個元素在這幾個子集裡有且僅有出現過一次)。先不管他的實際意義,
我們需要做的就是在乙個01矩陣的選取某幾行使之符合上述條件。我們很容易就想到列舉,然後判斷符不符合條件,
但是這個做法實在是太消耗時間。dacing links x就是乙個高效的求解該類問題的演算法,而這種演算法,基於交叉十字
迴圈雙向鏈的資料結構。
(3)精確覆蓋問題的定義:
給定乙個由0-1組成的矩陣,是否能找到乙個行的集合,使得集合中每一列都恰好包含乙個1
(4)重複覆蓋問題:
即選取乙個01矩陣中的幾行,使這幾行組成的新矩陣的每一列至少有乙個1。
該問題在精確覆蓋問題上減少了乙個約束條件
(5)應用:
解決精確覆蓋問題和重複覆蓋問題
*////**:
/*
**name:舞蹈連-精確覆蓋問題
**function:給定乙個由0-1組成的矩陣,是否能找到乙個行的集合,使得集合中每一列都恰好包含乙個1
**輸入引數:包含1的位置(i,j)
**輸出引數:行集合的資訊
*/#include #include using namespace std;
const int maxnode = 100010;
const int maxm = 1010;
const int maxn = 1010;
struct dlx
r[m] = 0,l[0] = m;
len = m;//編號,每列都有乙個頭結點,編號1~m
for(int i = 1; i <= n; i++)
h[i] = -1;//每一行的頭結點
}void link(int r,int c)
}void del(int c)}}
void resume(int c)
}l[r[c]] = r[l[c]] = c;
}bool dance(int d)
int c = r[0];
for(int i = r[0]; i != 0; i = r[i])
del(c);//找到結點數最少的列,當前元素不是原圖上0,1的節點,而是列頭節點
for(int i = d[c]; i != c; i = d[i])
resume(c);
return false;
}};dlx head;
int main()
}if(!head.dance(0))
printf("no\n");
else
}return 0;
}
/***name: 舞蹈連-重複覆蓋問題
**function: 即選取乙個01矩陣中的幾行,使這幾行組成的新矩陣的每一列至少有乙個1。
**輸入引數:包含1的位置(i,j)
**輸出引數:至少所消耗的行數,如果返回無窮大則表明不存在
*/#include #include #include #include using namespace std;
struct dlx
r[m]=0;
l[0]=m;
for(int i=1; i<=n; i++)
h[i]=-1;
}void link(int r,int c)
else
}int f()
for(int i=r[0]; i!=0; i=r[i])}}
}return ans;
}void del(int c)
}void resume(int c)
}void dance(int d)
int c=r[0];
for(int i=r[0]; i!=0; i=r[i])
r[m]=0,l[0]=m;
len=m;
for(int i=1; i<=n; i++)
{//cout<<"**"<
///擴充套件:
/*舞蹈連的步驟:
1、從矩陣中選擇一行
2、根據定義,標示矩陣中其他行的元素
3、刪除相關行和列的元素,得到新矩陣
4、如果新矩陣是空矩陣,並且之前的一行都是1,那麼求解結束,跳轉到6;新矩陣不是空矩陣,
繼續求解,跳轉到1;新矩陣是空矩陣,之前的一行中有0,跳轉到5
5、說明之前的選擇有誤,回溯到之前的乙個矩陣,跳轉到1;如果沒有矩陣可以回溯,說明該問題無解,跳轉到7
6、求解結束,把結果輸出
7、求解結束,輸出無解訊息
*/
資料結構 資料結構緒論
資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...
資料結構 資料結構演算法
分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...
資料結構 01 資料與資料結構
1.資料data 資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。2.資料元素data elements 資料元素是組成資料的 有一定意義的基本單位,在計算機中通常作為整體進行處理。3.資料物件data object 資料物件是性質相同的資料元素的...