还记得基于Dijkstra算法的最短路径问题求解这道题吗

我这题是把第二步换成采用Floyd算法求每一对顶点的最短路径 其他都是一样的 我在做课程设计 这个算法根本就是书上没有的 老师偏让我做 看到你曾经帮过别人 能帮帮我吗
进行类的设计与实现,解决最短路径问题。具体要求如下:
(1)采用图的邻接矩阵或邻接表实现最短路径问题中图的存储;
(2)采用Floyd算法求从每一对顶点的最短路径;
(3)将上述功能作为类的成员函数实现,编写主函数测试上述功能。
(4) 用C++编写,需要主函数

第1个回答  2012-12-23
Dijkstra 带输出路径,邻接表存图。。。以前写的代码。
int a[1000001],b[1000001],c[1000001];
int first[1000001],next1[1000001];
int g[1001];
int f[1001];
bool bo[1001];

int main()
{
// for (int i=0;i<1000000;i++)
// next1[i]=-1;
for (int i=1;i<=1000;i++)
f[i]=855993460;
int n,m;
cin>>n>>m;
for (int i=1;i<=m;i++)
{
cin>>a[i]>>b[i]>>c[i];
next1[i]=first[a[i]];
first[a[i]]=i;

}
int v=1;
f[v]=0;
for (int i=1;i<=n;i++)
{
for (int j=first[v];j!=0;j=next1[j])
if (f[v]+c[j]<f[b[j]]&&bo[b[j]]==false)
{
g[b[j]]=v;
f[b[j]]=f[v]+c[j];
}
int minnum=855993460,minv;
for (int i=1;i<=n;i++)
if (f[i]<minnum&&bo[i]==false)
minnum=f[i],minv=i;
v=minv;
bo[v]=true;
}
cout<<f[n]<<endl;

int k=n;
stack<int> sta;
while (k!=0)
{
sta.push(k);
k=g[k];
}
cout<<sta.top();
sta.pop();
while (!sta.empty())
{
cout<<"==>"<<sta.top();
sta.pop();
}
// system("PAUSE");
return 0;
}追问

用Floyd算法会吗?老师要求用Floyd 谢谢了

追答

..........
floyed不是更简单吗?比dijkstra或SPFA简单,但是是O(n^3)
这是核心代码。
f[i][j]表示i到j的最短路
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (f[i][k]+f[k][j]<f[i][j])
f[i][j]=f[i][k]+f[k][j];

追问

能帮我写一下全部程序吗 我真的一点都不会 谢谢您了

追答

这个是网上找的,不过也差不多,看了一下是没有读图的,你自己加上输入吧,下午忙,要我写的话晚上可以给你写一个,其实很简单的。
//每对顶点之间的最短路径 Folyed
#include
#define MAXVEX 6
#define INF 32767
void Floyed(int cost[][MAXVEX],int n)
{
int A[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX];
int i,j,k,pre;
for(i = 0;i A[i][k] + A[k][j])
{
A[i][j] = A[i][k] + A[k][j];
path[i][j] = k;
}
}
cout " << j << ":";
if(A[i][j] == INF)
{
if(i != j)
cout << "不存在路径" << endl;
}
else
{
cout << "路径长度为:" << " " << A[i][j];
cout << " 路径为" << i << " ";
pre = path[i][j];
while(pre != -1)
{
cout << pre << " ";
pre = path[pre][j];
}
cout << j << endl;
}
}
}

void main()
{
int cost[6][MAXVEX] = {
{0,50,10,INF,INF,INF},
{INF,0,15,50,10,INF},
{20,INF,0,15,INF,INF},
{INF,20,INF,0,35,INF},
{INF,INF,INF,30,0,INF},
{INF,INF,INF,3,INF,0},
};
Floyed(cost,6);
cout << endl;
}

本回答被提问者采纳
第2个回答  2012-12-19
Floyd算法是是一种用于寻找给定的加权图中顶点间最短路径的算法。具体用法你看看这个就会了,很详细的http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html

Dijkstra算法解最短路问题
理解Dijkstra算法的关键在于其通过逐步优化顶点的最短路径估计值,最终找到整个图的最短路径。这个算法不仅在理论上有很强的数学基础,而且在实际应用中也非常高效,广泛应用于各种需要解决最短路径问题的场景。总之,Dijkstra算法提供了一种有效的方法来解决最短路径问题,其核心在于通过迭代更新顶点的最短路径...

最短路径算法(Dijkstra)
Dijkstra( 迪科斯特拉 )算法是用来解决单源最短路径的算法,要求路径权值非负数。该算法利用了深度优先搜索和贪心的算法。下面是一个有权图,求从A到各个节点的最短路径。第1步:从A点出发,判断每个点到A点的路径(如果该点不能直连A点则距离值为无穷大,如果该点能和A直连则是当前的权值),计...

求最短路径的dijkstra算法
Dijkstra迪杰斯特拉是一种处理单源点的最短路径算法,就是说求从某一个节点到其他所有节点的最短路径就是Dijkstra。 资料拓展: 迪杰斯特拉算法(Dijkstra)是由荷兰数腔计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其薯纳衫余各顶点的最短路径算法,解决的是有权图中最短路径问题。

最短路径算法(Dijkstra)
Dijkstra算法是解决带有非负权值的最短路径问题的一种著名算法,它基于深度优先搜索和贪心策略。以下是应用Dijkstra算法解决一个有权图中的单源最短路径问题的情况。1. 初始化:从起点A开始,对所有其他节点,假设它们到A的距离为无穷大,只有A到自身的距离为0。将A点标记为已访问,并进行颜色标记,结果...

Dijkstra算法解最短路问题
然后逐步更新这些值以求解最短路径。最后,我们讨论了图与网络问题的更深层次,强调了对图论基础的理解对于解决复杂问题的重要性。Dijkstra算法的应用不仅仅是数学的计算,更是一种逻辑思维和问题解决能力的展现。通过实践,我们可以逐步掌握更多关于图论的知识,为解决实际问题提供有力工具。

带条件的dijkstra最短路径问题
带条件的Dijkstra算法是在经典Dijkstra算法基础上,解决在保证经过节点最少前提下的最短路径问题。它在传统算法流程中增加了判断环节,以满足特定条件,如最小城市数到达、召集救援队最多等。以下是算法的直观描述:带条件的Dijkstra算法处理的是在图中找到两点之间最短路径,但同时需要考虑额外的约束。例如,...

[最短路径问题]—Dijkstra 算法最详解
Dijkstra算法由荷兰计算机科学家Edsger Wybe Dijkstra于1956年发现,用于解决赋权图的单源最短路径问题。原始版本仅适用于找到两个顶点之间的最短路径,后来常见的变体则是固定一个顶点作为源结点,进而找到该顶点到图中所有其它结点的最短路径,形成一个最短路径树。算法每次取出未访问结点中距离最小的,用...

运筹学用dijkstra算法求最短路径
1-3 = 5 1-4 = 2 全部遍历完后我在从下面的第一个子节点开始遍历,1(-2)-5 = 11 1(-2)-3 = 10 和1-3 = 5 对比 5<10 那么 1-3 = 5 1(-3)-2 = 11 和1-2 = 4进行对比 4<11 那么1-2 = 4 1(-3)-6 = 14 1(-3)-4 = 6 和 1-4 = 2进行对比 2< 6 那么...

利用Dijkstra算法求下图中从顶点1到其它各顶点间的最短路径,按下面表格...
Dijkstra:求单源、无负权的最短路。时效性较好,时间复杂度为O(V*V+E)。源点可达的话,O(V*lgV+E*lgV)=>O(E*lgV)。当是稀疏图的情况时,此时E=V*V\/lgV,所以算法的时间复杂度可为O(V^2)。若是斐波那契堆作优先队列的话,算法时间复杂度,则为O(V*lgV + E)。以上内容...

怎样用DIJKSTRA算法设计最短路径
在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。2)算法步骤:a.初始时,S只...

相似回答