1. 程式人生 > >基於回溯法尋找哈密頓迴路

基於回溯法尋找哈密頓迴路

回溯法是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。

在包含問題的所有解的解空間樹中,按照深度優先搜尋的策略,從根結點出發深度探索解空間樹。當探索到某一結點時,要先判斷該結點是否包含問題的解,如果包含,就從該結點出發繼續探索下去,如果該結點不包含問題的解,則逐層向其祖先結點回溯(其實回溯法就是對隱式圖的深度優先搜尋演算法)。 若用回溯法求問題的所有解時,要回溯到根,且根結點的所有可行的子樹都要已被搜尋遍才結束。 而若使用回溯法求任一個解時,只要搜尋到問題的一個解就可以結束。

哈密頓圖是一個無向圖,由天文學家哈密頓提出,由指定的起點前往指定的終點,途中經過所有其他節點且只經過一次。在圖論中是指含有哈密頓迴路的圖,閉合的哈密頓路徑稱作哈密頓迴路,含有圖中所有頂點的路徑稱作哈密頓路徑。

利用回溯法判斷哈密頓迴路是一種簡單粗暴的試探,也因而容易理解,其方法如下程式碼,因註釋詳細,不再詳述。

#include <iostream>
using namespace std;
const int MAX_V = 50;
void print(int path[], int V)
{
    cout << "存在哈密頓迴路" << endl;
    
for (int i = 0; i < V; i++) cout << path[i] << " "; cout << path[0] << endl; } //path記錄路徑,visited記錄頂點是否訪問過,len記錄當前路徑的長度 bool hamCycle(int graph[][MAX_V], int V, int path[], bool visited[], int current) { if (current == V) { //訪問到最後一個頂點 if (graph[path[current - 1]][0
] == 1) return true;//有到0點的邊 else return false; } //遍歷起點外其它頂點 for (int v = 1; v < V; v++) { //如果沒訪問過,並且有邊相連 if (!visited[v] && graph[path[current - 1]][v] == 1) { visited[v] = true; path[current] = v; //當本次遞迴的child也為true時返回true if (hamCycle(graph, V, path, visited, current + 1)) return true; //當本條遞迴線路失敗時恢復原圖 path[current] = -1; visited[v] = false; } } return false; } //從起點開始引導 bool hamCycleStart(int graph[][MAX_V], int V) { int path[MAX_V]; memset(path, -1, sizeof(path)); bool visited[MAX_V] = { 0 }; path[0] = 0; visited[V] = true; //把起點標記為訪問過 //起點已確定,current從1開始 if (hamCycle(graph, V, path, visited, 1) == false) { cout << "哈密頓迴路不存在" << endl; return false; } print(path, V); return true; } int main() { int graph[MAX_V][MAX_V]; int V; cout << "請輸入點的個數:" << endl; cin >> V; for (int i = 0;i < V;++i) { cout << "請輸入圖的第" << i << "" << endl; for (int j = 0;j < V;++j) { cin >> graph[i][j]; } } hamCycleStart(graph, V); return 0; }

相關推薦

基於回溯尋找哈密迴路

回溯法是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。 在包含問題的所有解的解空間樹中,按照深度優先搜尋的策

基於回溯思想:輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

    連結:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7 來源:牛客網 import java.util.List; import java.util.Col

哈密迴路模板

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=405; int ans[maxn],g[max

【Codeforces】【圖論】【數量】【哈密迴路】Fake bullions (CodeForces - 804F)

題意 有n個黑幫(gang),每個黑幫有siz[i]個人,黑幫與黑幫之間有有向邊,並形成了一個競賽完全圖(即去除方向後正好為一個無向完全圖)。在很多年前,有一些人蔘與了一次大型搶劫,參與搶劫的人都獲得了一個真金條。 在這些年間,不同的黑幫之間進行了交易。具體過程是: 在時刻i,假如有一條邊是u->

回溯尋找數獨(java)

import java.util.Calendar; import java.util.Date; public class Matrix {  private int matrix[][];  private long timeAfter=0;   private long timeBefore

哈密迴路模版

找一條哈密頓迴路。 一個無向圖,若每個點連到其他的一半或一半以上的點,則這個圖一定存在哈密頓迴路 (就是5個點,則每個點至少有3條邊) HDU 4337的裸題 #include <cstdio> #include <cstring> #includ

歐拉回路&特殊圖下的哈密迴路題集【夏天的風】

歐拉回路 【HDU】 1878歐拉回路  判斷30181116Play on Words2894DeBruijin 茲鼓歐拉回路1956Sightseeing tour 混合尤拉3472HS BDC 混合尤拉==========================

【例題】【圖論(哈密迴路)&DP(狀壓)】

1、 NKOJ 3707 送外賣 時間限制 : - MS 空間限制 : 65536 KB 評測說明 : 時限2000ms 問題描述 有一個送外賣的,他手上有n份訂單,他要把n份東西

歐拉回路&特殊圖下的哈密迴路題集

歐拉回路 【HDU】 1878歐拉回路  判斷3018Ant Trip 一筆畫問題   1116Play on Words2894DeBruijin 茲鼓歐拉回路1956Sightseeing tour 混合尤拉3472HS BDC 混合尤拉=========

哈密哈密迴路 哈密通路(Hamilton)

概念:   哈密頓圖:圖G的一個迴路,若它通過圖的每一個節點一次,且僅一次,就是哈密頓迴路.存在哈密頓迴路的圖就是哈密頓圖.哈密頓圖就是從一點出發,經過所有的必須且只能一次,最終回到起點的路徑.圖中有的邊可以不經過,但是不會有邊被經過兩次.   與尤拉圖的區別:尤拉圖討論

哈密道路與哈密迴路

簡介 1857年愛爾蘭數學家哈密爾頓發明了“周遊世界”玩具,用一個正十二面體的20個頂點表示世界上20個大城市,30條稜代表這些城市之間的道路。要求遊戲者從任意一個城市(即頂點)出發,延稜行走經過每個城市一次且只經過一次,最終返回出發地。哈密爾頓將此問題稱為周遊世界問題,並且作了肯定的回答。 以下是一種走

尋找漢密爾迴路(java版)

package hg; public class Hanmierdun {     //結點的個數     public int n =5;     public int b[] = new int[5];

圖的點著色、區間著色問題及其應用(基於貪心思想的DFS回溯求點著色問題和區間著色演算法求解任務排程問題)

Graph Coloring Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4503 Accepted: 2059 Special Judge Description You are

hdu 4337——poj 2438(哈密迴路求解模板)

               轉:http://imlazy.ycool.com/post.2072698.html :設一個無向圖中有 N 個節點,若所有節點的度數都大於等於 N/2,則漢密爾頓迴路一定存在。注意,“N/2” 中的除法不是整除,而是實數除法。如果 N 是偶

無向哈密迴路Dirac 定理證明和競賽圖為哈密通路的證明過程

Dirac 定理: 設一個無向圖中有 N 個節點,若所有節點的度數都大於等於 N/2,則漢密爾頓迴路一定存在。注意,“N/2” 中的除法不是整除,而是實數除法。如果 N 是偶數,當然沒有歧義;如果 N 是奇數,則該條件中的 “N/2” 等價於 “⌈N/2⌉”。 而我想

回溯

深度 問題 思想 最優 產生 剪枝 bound 過程 空間 一、回溯法的基本思想   在問題的解空間樹中,按深度優先策略,從根節點出發搜素解空間樹。算法搜素至解空間樹的任一結點時,先判斷該結點是否包含問題的解,如果肯定不包含,則跳過對以該結點為根的子樹的搜索,逐層向其祖先結

POJ 2288 Islands And Bridges 狀態壓縮dp+哈密回路

pac -1 path max def %d 註意 sca can 題意:n個點 m條邊的圖,路徑價值定義為相鄰點乘積,若路路徑c[i-1]c[i]c[i+1]中c[i-1]-c[i+1]有邊 則價值加上三點乘積找到價值最大的哈密頓回路,和相應的方法數n<=13.暴力

[leetcode]79.Search Word 回溯

string 當前位置 leetcode 開頭 targe cnblogs for 元素 pan /** * Given a 2D board and a word, find if the word exists in the grid. The word can

[LeetCode] 679. 24 Game(回溯

desc ann 兩個 java lan sof vision res unary 傳送門 Description You have 4 cards each containing a number from 1 to 9. You need to judge wh

回溯實例詳解(轉)

函數 枚舉 必須 using tool 有一個 發現 ads 問題 概念 回溯算法實際上一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。 回溯法是一種選優搜索法,按選優條件向前搜索,以達