还记得基于Dijkstra算法的最短路径问题求解这道题吗
我这题是把第二步换成采用Floyd算法求每一对顶点的最短路径其他都是一样的我在做课程设计这个算法根本就是书上没有的老师偏让我做看到你曾经帮过别人能帮帮我吗进行类的设计与实...
我这题是把第二步换成采用Floyd算法求每一对顶点的最短路径 其他都是一样的 我在做课程设计 这个算法根本就是书上没有的 老师偏让我做 看到你曾经帮过别人 能帮帮我吗
进行类的设计与实现,解决最短路径问题。具体要求如下:
(1)采用图的邻接矩阵或邻接表实现最短路径问题中图的存储;
(2)采用Floyd算法求从每一对顶点的最短路径;
(3)将上述功能作为类的成员函数实现,编写主函数测试上述功能。
(4) 用C++编写,需要主函数 展开
进行类的设计与实现,解决最短路径问题。具体要求如下:
(1)采用图的邻接矩阵或邻接表实现最短路径问题中图的存储;
(2)采用Floyd算法求从每一对顶点的最短路径;
(3)将上述功能作为类的成员函数实现,编写主函数测试上述功能。
(4) 用C++编写,需要主函数 展开
2个回答
展开全部
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;
}
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];
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
Floyd算法是是一种用于寻找给定的加权图中顶点间最短路径的算法。具体用法你看看这个就会了,很详细的http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询