在最新的 IEEE Xtreme 竞赛中,我试图解决的一个问题是,
输入两点 p1(x1,y1) , p2(x2,y2) 你必须找到从 p1 到 p2 的最短路径的长度,
例如,如果 p1(1,1) , p2(4,4) 则最短路径的长度为 9 条边,
我做了一些类似深度优先搜索的事情,如果两点之间的距离很小,并且例如点(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 吗?