1. 程式人生 > >演算法學習---關於哈密頓圖的哈密頓通路求解問題

演算法學習---關於哈密頓圖的哈密頓通路求解問題

之前以自己一渣渣之身參加了一個比賽,果然連門檻都沒摸到,雖然略有沮喪不過還是得到了很多思考噠,這裡記一下。

因為之前沒有接觸過演算法,感覺這個可能也只是能夠解決問題,效率極低,先記下來以後有興致慢慢優化好了。

首先,說明本次問題:

本次問題是,構建一個有向哈密頓圖,給出任意兩個點,找到他們之間存在的哈密頓通路。哈密頓通路需要保證所有點被遍歷到,同時不能有重複點。

(由於比較習慣java,所以偷懶直接寫java版的吧。還得好好學習c的說!)

這裡我考慮用遞迴的方式,求出存在的哈密頓通路。

step1:構建圖的方式

HashMap<Integer,ArrayList<
Integer>> myMap = new HashMap<Integer, ArrayList<Integer>>(); //其中,key值為點的ID值,value為與該點相連線的點的ID值

step2:找到哈密頓通路

int size = myMap.size();    //點的個數
void findHamiltonianPath(int id,Integer[] edge){
        for(int pointID: myMap.get(id)){
            if(edge.length!=size-1 && pointID ==destinationID) continue
; //提前到達目標點 if(ifHavePassed(edge,pointID)) continue; //曾經經過此點,ifHavePassed函式用於檢查路徑中是否已含有該點 Integer[] newEdge = new Integer[edge.length+1]; System.arraycopy(edge,0,newEdge,0,edge.length); newEdge[edge.length] = pointID; //得到新的路徑陣列
if(pointID == destinationID){ System.out.println(Arrays.asList(newEdge)); continue; } findHamiltonianPath(pointID, newEdge); } }

感覺原理還是蠻簡單的,但是應該還能優化很多。
希望明年能摸到比賽的門檻~