最新の IEEE Xtreme コンペティションで、私が解決しようとした問題は次のとおりです。
入力 2 点 p1(x1,y1) , p2(x2,y2) p1 から p2 への最短経路の長さを見つける必要があります。
たとえば、 p1(1,1) 、 p2(4,4) の場合、最短パスの長さは 9 つのエッジになります。
私は深さ優先検索のようなことをしました.2点間の距離が小さく、例えば点(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();
}
}
これより速い方法はありますか?? この無向グラフにダイクストラを使用できますか??