-
单纯的给出某个点到所有点的最小权值,可以利用各种算法,但是给出某一个点到所有节点的全职最短路径的算法比较少。经过长时间的思考。终于初有成效。
我们要处理的图片如下:
我们求出1到各个节点的最短路径。
我们可以定义一个mappath(map<int,vector>)的map。存储1-2,1-3,1-4,1-5的最短路径等。这样我们在1,2,4中找最短路径的时候,比如我们找到4-5=2是最小的,那么我们可以返回mappath[4],这样5的最短路径就是mappath[4].push_back(5)。就是1-5的最短路径。
1-2-4-5再找最短路径,找到3(3是4给出来的)最小,3的最短路径就是mappath[4].push_back(3)即可。这样mappath存储的就是1到各个节点的最短路径的走法。
直接上代码:
#include
#include
#include
#includefor (int i = 0; i < vectorVisted.size(); i++)
{
int num = vectorVisted[i];
for (Node *nd = gGraph[num]; nd != nullptr; nd = nd->next)
{
if (nd->weight < minValue && visited[nd->val] == 0)
{
minValue = nd->weight;
vexter = nd->val;
vexterfront = num;
}
}
}
if (vexterfront == -1)
{
return;
}
if (mapPath.find(vexterfront) != mapPath.end())
{
auto x = mapPath[vexterfront];
x.push_back(vexter);
mapPath[vexter] = x;
}
calShortPath(vexter);
}
void display()
{
for (int i = 0; i <= max_num; i++)
{
auto head = gGraph[i];
if (head)
{
while (head)
{
cout << i << " <–> " << head->val<<" "<weight<<endl;
head = head->next;
}
cout << “--------” << endl;
}
}
}
int main()
{
memset(visited, 0, sizeof(visited));
addEdge(1, 2, 4);
addEdge(1,4,6);
addEdge(2,4,1);
addEdge(2,5,4);
addEdge(3,4,3);
addEdge(3,5,7);
addEdge(4,5,2);
addEdge(4,6,5);
addEdge(5,7,4);
addEdge(6,7,6);
mapPath[1] = vector{ 1 };
calShortPath(1);
for (auto x : mapPath)
{auto vectori = x.second; cout << "1 start and to "<<x.first<<":" << endl; for (auto i : vectori) { cout << i << " "; } cout << endl;
}
//display();
system(“pause”);
return 0;
}
执行结果如下图所示:
当然本算法也有缺点,如果存在孤立点或者子图的情况下不好处理。
求一个无向图的某一点到所有点的最短路经
最新推荐文章于 2024-04-15 14:37:00 发布