演算法學習---關於哈密頓圖的哈密頓通路求解問題
阿新 • • 發佈:2019-01-09
之前以自己一渣渣之身參加了一個比賽,果然連門檻都沒摸到,雖然略有沮喪不過還是得到了很多思考噠,這裡記一下。
因為之前沒有接觸過演算法,感覺這個可能也只是能夠解決問題,效率極低,先記下來以後有興致慢慢優化好了。
首先,說明本次問題:
本次問題是,構建一個有向哈密頓圖,給出任意兩個點,找到他們之間存在的哈密頓通路。哈密頓通路需要保證所有點被遍歷到,同時不能有重複點。
(由於比較習慣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);
}
}
感覺原理還是蠻簡單的,但是應該還能優化很多。
希望明年能摸到比賽的門檻~