在最新的IEEE Xtreme竞赛中,我尝试解决的问题是:输入两个点p1(x1,y1),p2(x2,y2),你必须找到从p1到p2的最短路径长度。
例如,如果p1(1,1),p2(4,4),则最短路径长度为9个边。
我做了类似深度优先搜索的东西,如果两点之间的距离很小,则效果很好,如果对于点(1,1)和(10,10),则需要很长时间。
并且有一个点的限制,最大点为(12,12)。
我的方法是将上面的图片转换为带有所有权重为1的无向图,然后找到最短路径。
这里是我的函数,用于查找最短路径:
例如,如果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();
}
}
有没有比这更快的方法?我能在这个无向图中使用迪杰斯特拉算法吗?