回溯演算法2

2021-09-29 05:47:14 字數 1614 閱讀 8469

回溯演算法2
圖的m著色問題

輸入樣例

5 41 3

1 21 4

2 32 4

2 53 4

4 50 0

輸出樣例

1 2 3 4 1

1 2 3 4 3

1 2 4 3 1

1 2 4 3 4

1 3 2 4 1

1 3 2 4 2

1 3 4 2 1

…4 3 2 1 4

total=48

對m種顏色編號為1,2,…,m,由於每個頂點可從m種顏色中選擇一種顏色著色,如果無向連通圖g=(v, e)的頂點數為n,則解空間的大小為mn種,解空間是非常龐大的,它是一棵m叉樹。

圖的m著色問題的約束函式是相鄰的兩個頂點需要著不同的顏色,但是沒有限界函式。

假設無向連通圖g=(v, e)的鄰接矩陣為a,如果頂點i和j之間有邊,則a[i][j]=1,否則a[i][j]=0。

設問題的解向量為x (x1, x2 , …, xm) ,其中xi∈,表示頂點i所著的顏色是x[i],即解空間的每個結點都有m個兒子。

#define num 100

int n; //圖的頂點數量

int m; //可用顏色數量

int a[num][num]; //圖的鄰接矩陣

int x[num]; //當前的解向量

int sum ; //已經找到的可m著色

//形參t是回溯的深度,從1開始

void backtrack(int t )

else  //搜尋當前擴充套件結點的m個孩子

for(i=1; i<=m; i++ )

}

n皇后問題

在n×n格的棋盤上放置彼此不受攻擊的n個皇后。

按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。

n皇后問題等價於在n×n格的棋盤上放置n個皇后,任何兩個皇后不放在同一行或同一列或同一斜線上。

程式設計要求:找出乙個n×n格的棋盤上放置n個皇后並使其不能互相攻擊的所有方案。

由於棋盤的每列/行只有乙個皇后,所以可以用一維向量x( x1, x2, …, xn),其中xi∈,表示第i列皇后所在的行x[i],即解空間的每個結點都有n個兒子,因此解空間的大小為nn,這是一棵子集樹。

#define num 20

int n; //棋盤的大小

int x[num]; //解向量

int sum; //當前已經找到的可行方案數

void backtrack(int t)

else

for (i=1; i<=n; i++)

}//形參t是回溯的深度

inline bool place(int t)

return;

}  else }}}

演算法 回溯 求子集2

給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 1,2,2 輸出 2 1 1,2,2 2,2 1,2 和演算法 回溯 位運算 求子集類似,只不過需要剔除相同的組合。class solution arrays.sort nums ...

演算法筆記之回溯法(2)

假設地圖共有7個區域,分別是a b c d e f g,對上面順序進行編號,每個區域用乙個結點表示,相鄰的區域有連線,那麼地圖就轉化成乙個無向連線圖。定義問題的解空間。圖的m著色問題解空間形式為n元組,每個分量取值為1,2,3,m,即問題的解是乙個n元向量。由此可得,問題的解空間為,其中顯約束為xi...

演算法筆記之回溯法(2)

假設地圖共有7個區域,分別是a b c d e f g,對上面順序進行編號,每個區域用乙個結點表示,相鄰的區域有連線,那麼地圖就轉化成乙個無向連線圖。定義問題的解空間。圖的m著色問題解空間形式為n元組,每個分量取值為1,2,3,m,即問題的解是乙個n元向量。由此可得,問題的解空間為,其中顯約束為xi...