Python基于回溯法子集樹(shù)模板解決m著色問(wèn)題示例
本文實(shí)例講述了Python基于回溯法子集樹(shù)模板解決m著色問(wèn)題。分享給大家供大家參考,具體如下:
問(wèn)題
圖的m-著色判定問(wèn)題
給定無(wú)向連通圖G和m種不同的顏色。用這些顏色為圖G的各頂點(diǎn)著色,每個(gè)頂點(diǎn)著一種顏色,是否有一種著色法使G中任意相鄰的2個(gè)頂點(diǎn)著不同顏色?
圖的m-著色優(yōu)化問(wèn)題
若一個(gè)圖最少需要m種顏色才能使圖中任意相鄰的2個(gè)頂點(diǎn)著不同顏色,則稱這個(gè)數(shù)m為該圖的色數(shù)。求一個(gè)圖的最小色數(shù)m的問(wèn)題稱為m-著色優(yōu)化問(wèn)題。
分析
解的長(zhǎng)度是固定的,n。若x為本問(wèn)題的一個(gè)解,則x[i]表示第i個(gè)節(jié)點(diǎn)的涂色編號(hào)。
可以將m種顏色看作每個(gè)節(jié)點(diǎn)的狀態(tài)空間。每到一個(gè)節(jié)點(diǎn),遍歷所有顏色,剪枝,回溯。
不難看出,可以套用回溯法子集樹(shù)模板。
代碼
'''圖的m著色問(wèn)題''' # 用鄰接表表示圖 n = 5 # 節(jié)點(diǎn)數(shù) a,b,c,d,e = range(n) # 節(jié)點(diǎn)名稱 graph = [ {b,c,d}, {a,c,d,e}, {a,b,d}, {a,b,c,e}, {b,d} ] m = 4 # m種顏色 x = [0]*n # 一個(gè)解(n元數(shù)組,長(zhǎng)度固定)注意:解x的下標(biāo)就是a,b,c,d,e!!! X = [] # 一組解 # 沖突檢測(cè) def conflict(k): global n,graph,x # 找出第k個(gè)節(jié)點(diǎn)前面已經(jīng)涂色的鄰接節(jié)點(diǎn) nodes = [node for node in range(k) if node in graph[k]] if x[k] in [x[node] for node in nodes]: # 已經(jīng)有相鄰節(jié)點(diǎn)涂了這種顏色 return True return False # 無(wú)沖突 # 圖的m著色(全部解) def dfs(k): # 到達(dá)(解x的)第k個(gè)節(jié)點(diǎn) global n,m,graph,x,X if k == n: # 解的長(zhǎng)度超出 print(x) #X.append(x[:]) else: for color in range(m): # 遍歷節(jié)點(diǎn)k的可涂顏色編號(hào)(狀態(tài)空間),全都一樣 x[k] = color if not conflict(k): # 剪枝 dfs(k+1) # 測(cè)試 dfs(a) # 從節(jié)點(diǎn)a開(kāi)始
效果圖
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- python 回溯法模板詳解
- Python基于回溯法子集樹(shù)模板解決選排問(wèn)題示例
- Python基于回溯法子集樹(shù)模板解決全排列問(wèn)題示例
- Python基于回溯法子集樹(shù)模板解決旅行商問(wèn)題(TSP)實(shí)例
- Python基于回溯法子集樹(shù)模板實(shí)現(xiàn)圖的遍歷功能示例
- Python基于回溯法子集樹(shù)模板解決取物搭配問(wèn)題實(shí)例
- Python基于回溯法子集樹(shù)模板解決數(shù)字組合問(wèn)題實(shí)例
- Python基于回溯法子集樹(shù)模板解決0-1背包問(wèn)題實(shí)例
- Python基于回溯法子集樹(shù)模板實(shí)現(xiàn)8皇后問(wèn)題
- Python回溯法(Backtracking)的具體使用
相關(guān)文章
詳解Python中使用base64模塊來(lái)處理base64編碼的方法
8bit的bytecode經(jīng)常會(huì)被用base64編碼格式保存,Python中自帶base64模塊對(duì)base64提供支持,這里我們就來(lái)詳解Python中使用base64模塊來(lái)處理base64編碼的方法,需要的朋友可以參考下2016-07-07Python在信息學(xué)競(jìng)賽中的運(yùn)用及Python的基本用法(詳解)
下面小編就為大家?guī)?lái)一篇Python在信息學(xué)競(jìng)賽中的運(yùn)用及Python的基本用法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Python sklearn庫(kù)實(shí)現(xiàn)PCA教程(以鳶尾花分類為例)
今天小編就為大家分享一篇Python sklearn庫(kù)實(shí)現(xiàn)PCA教程(以鳶尾花分類為例),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02python3簡(jiǎn)單實(shí)現(xiàn)微信爬蟲(chóng)
我們可以通過(guò)python 來(lái)實(shí)現(xiàn)這樣一個(gè)簡(jiǎn)單的爬蟲(chóng)功能,把我們想要的代碼爬取到本地。下面就看看如何使用python來(lái)實(shí)現(xiàn)這樣一個(gè)功能。2015-04-04pandas常用表連接merge/concat/join/append詳解
使用python的pandas庫(kù)可以很容易幫你搞定,而且性能也是很出色的;百萬(wàn)級(jí)的表關(guān)聯(lián),可以秒出,本文給大家分享pandas常用表連接merge/concat/join/append詳解,感興趣的朋友跟隨小編一起看看吧2023-02-02python3+PyQt5實(shí)現(xiàn)自定義窗口部件Counters
這篇文章主要為大家詳細(xì)介紹了python3+PyQt5實(shí)現(xiàn)自定義窗口部件,Counters自定窗口部件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04python實(shí)現(xiàn)得到一個(gè)給定類的虛函數(shù)
這篇文章主要介紹了python實(shí)現(xiàn)得到一個(gè)給定類的虛函數(shù)的方法,以wx的PyPanel類為例講述了打印以base_開(kāi)頭的方法的實(shí)例,需要的朋友可以參考下2014-09-09