在最新的IEEE Xtreme競賽中,我試圖解決的一個問題是,Hexagon計劃中的最短路徑?
輸入兩點p1(x1,y1),p2(x2,y2)必須找到p1的最短路徑長度到P2,
例如,如果P1(1,1),P2(4,4),那麼最短路徑的9個邊緣lenght,
我不喜歡的東西深度優先搜索,如果兩點之間的距離很小,並且對於點(1,1)需要很長時間(10,10),
並且最大點(12,12)的點數有限制。
我的方法是將上述圖片轉換爲所有權重爲1的無向圖,然後找到最短路徑。
這裏是我的功能找到最短路徑:
int minCost;
vector<int> path;
multimap<int,int> Connections;
typedef multimap<int,int>::iterator mmit;
void shortestPath(int cs){
if(cs > minCost)
return;
if(path.back() == Target){
if(cs < minCost)
minCost = cs;
return;
}
pair<mmit,mmit> it = Connections.equal_range(path.back());
mmit mit = it.first;
for(; mit != it.second ; ++mit){
if(isVisited(mit->second))
continue;
markVisited(mit->second);
path.push_back(mit->second);
shortestPath(cs+1);
markUnvisited(mit->second);
path.pop_back();
}
}
有什麼方法比這個更快?我可以使用dijkstra來獲取這張無向圖嗎?
也許使用廣度優先搜索? – irrelephant
使用深度優先搜索似乎是最糟糕的想法!看起來廣度優先搜索是要走的路(這應該相當於最好的搜索,因爲所有步驟的大小都是相同的)。鑑於從源頭到目標的方向是已知的,你也可以排除任何向錯誤方向移動的東西。 –
aha,我會嘗試bfs,但是如何知道目標的方向? –