回溯演算法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...