Vision 資料結構 舞蹈連

2021-08-09 01:13:21 字數 2534 閱讀 5374

///定義(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 資料物件是性質相同的資料元素的...