一个c语言编程球最短路问题....

假设有一个n个点的图,现在我一直其中的m个点(m<n)。现在我想在这m个顶点里求一条最短路,应该如何实现?求代码....解决了加送分!!!!... 假设有一个n个点的图,现在我一直其中的m个点(m<n)。
现在我想在这m个顶点里求一条最短路,应该如何实现?
求代码....
解决了加送分!!!!
展开
 我来答
独孤冷潆
2010-07-04 · TA获得超过6395个赞
知道大有可为答主
回答量:3079
采纳率:0%
帮助的人:3088万
展开全部
用floyd算法(时间复杂度为0(N*3))
具体实现如下:
#include<fstream>
#define Maxm 501
using namespace std;
ifstream fin;
ofstream fout("APSP.out");
int p,q,k,m;
int Vertex,Line[Maxm];
int Path[Maxm][Maxm],Map[Maxm][Maxm],Dist[Maxm][Maxm];
void Root(int p,int q)
{
if (Path[p][q]>0)
{
Root(p,Path[p][q]);
Root(Path[p][q],q);
}
else
{
Line[k]=q;
k++;
}
}
int main()
{
memset(Path,0,sizeof(Path));
memset(Map,0,sizeof(Map));
memset(Dist,0,sizeof(Dist));
fin >> Vertex;
for(p=1;p<=Vertex;p++)
for(q=1;q<=Vertex;q++)
{
fin >> Map[p][q];
Dist[p][q]=Map[p][q];
}
for(k=1;k<=Vertex;k++)
for(p=1;p<=Vertex;p++)
if (Dist[p][k]>0)
for(q=1;q<=Vertex;q++)
if (Dist[k][q]>0)
{
if (((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==0))&&(p!=q))
{
Dist[p][q]=Dist[p][k]+Dist[k][q];
Path[p][q]=k;
}
}
for(p=1;p<=Vertex;p++)
{
for(q=p+1;q<=Vertex;q++)
{
fout << "\n==========================\n";
fout << "Source:" << p << '\n' << "Target " << q << '\n';
fout << "Distance:" << Dist[p][q] << '\n';
fout << "Path:" << p;
k=2;
Root(p,q);
for(m=2;m<=k-1;m++)
fout << "-->" << Line[m];
fout << '\n';
fout << "==========================\n";
}
}
fin.close();
fout.close();
return 0;
}

参考资料: 详细请参考:http://baike.baidu.com/view/14495.htm?fr=ala0_1_1

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
20101325028
2012-05-30
知道答主
回答量:5
采纳率:0%
帮助的人:3.1万
展开全部
[code=C/C++][/code]#include"stdio.h"
#include"string.h"
#define Lm 20000
int main()
{
int map[102][102],i,j,k,m,n,a,b;
while(scanf("%d%d",&n,&m)&&(m||n)){
memset(map,0,sizeof(map));
while(m--) {scanf("%d%d",&a,&b);scanf("%d",&map[a][b]);map[b][a]=map[a][b];}
for(i=0;i<102;i++)
for(j=0;j<102;j++) if(map[i][j]==0) map[i][j]=Lm;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
{
if(i==j||i==k||k==j) continue;
if(map[i][k]<Lm&&map[k][j]<Lm&&map[i][j]-map[i][k]>map[k][j])
{map[i][j]=map[i][k]+map[k][j];}
}
printf("%d\n",map[1][n]);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
loveismyselves
2010-07-04 · 超过34用户采纳过TA的回答
知道答主
回答量:122
采纳率:0%
帮助的人:109万
展开全部
floyed算法,你这个比较麻烦 ,然后你再两次for循环比较求最大值,就解决了,还可以直接用dijistra
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式