数据结构课程设计作业:求任意两点的最短路径问题,写个完整的程序..急求啊...小弟上学期没学好..解决加分谢

就是解决任意两点之间的最短路径…用Dijkstra算法实现…... 就是解决任意两点之间的最短路径…用Dijkstra算法实现… 展开
 我来答
leijianbin
2010-11-04 · TA获得超过350个赞
知道小有建树答主
回答量:160
采纳率:0%
帮助的人:232万
展开全部
一:
#include "stdafx.h"
#include <limits>
#include <iostream>
#include <fstream>
using namespace std;

const int MAXINT = numeric_limits<int>::max();

template <class Type>
void Dijkstra(int n, int v, Type dist[], int prev[], Type** c)
{

bool *s = new bool[n+1];
int i, j;
for(i = 1; i <=n; i++)
{
dist[i] = c[v][i];
if(c[v][i]!=MAXINT)
prev[i] = v;
else prev[i] =0;
s[i] = false;
}
s[v] = true;
dist[v] = 0;
prev[v] = 0;

for(i = 1; i< n; i++)
{

int u = v;
int temp = MAXINT;
for( j = 1; j<=n; j++)
if(!s[j]&&dist[j]<temp)
{
u = j;
temp = dist[j];
}
s[u] = true;
for(j=1; j<=n; j++)
{
if((!s[j])&&c[u][j]<MAXINT)
{
if((dist[u]+c[u][j])<dist[j])
{
dist[j] = dist[u] + c[u][j];
prev[j] = u;
}
}
}

}

delete [] s;

}
void djpath(int m, int v, int prev[])
{
int i = m ,j =1;

while(i!=0)
{
if (j == 1)
{
cout<< i;
j = 0;
}
else
cout<< "-" << i;
i = prev[i];
}

cout<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
cout<<"最大整数:"<<MAXINT<<endl;
int prev[6], dist[6];
int i,j,n;
int** myc;

FILE *fp;
fp=fopen("data.txt", "r");
fscanf(fp,"%d", &n);

myc = new int* [n+1];
for(i =0; i<=n; i++)
myc[i] = new int[n+1];

for(i=1; i<=n; i++)
for(j =1; j<=n; j++)
{
fscanf(fp, "%d",&myc[i][j]);
if (myc[i][j]==-1)
myc[i][j] = MAXINT;
}

Dijkstra(5, 1, dist, prev, myc);

for(i = 1; i<=5; i++)
cout<<dist[i]<<endl;

for(i=2; i<=5; i++)
djpath(i,1,prev);

for(i = 0; i<=5; i++)
delete[] myc[i];
delete [] myc;

return 0;
}

输入数据采用文本文件格式,下面是data.txt的内容:
5
0 10 -1 30 100
10 0 50 -1 -1
-1 50 0 20 10
30 -1 20 0 60
100 -1 10 60 0

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mikewolf2009/archive/2009/09/12/4545537.aspx

二:
#include<iostream>
using namespace std;

void main()
{
int infinity=100,j,i,n,k,t,**w,*s,*p,*d;
cout<<"input the value of n:";
cin>>n;
cout<<endl;

d=new int[n];
s=new int[n];
p=new int[n];
w=new int*[n];
for(i=0;i<n;i++) {w[i]=new int[n];}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>w[i][j];

for(s[0]=1,i=1;i<n;i++)
{
s[i]=0;d[i]=w[0][i];
if(d[i]<infinity) p[i]=0;
else p[i]=-1;
}

for(i=1;i<n;i++)
{
t=infinity;k=1;
for(j=1;j<n;j++)
if((!s[j])&&(d[j]<t)) {t=d[j];k=j;} //在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集是Dijkstra算法的关键
s[k]=1;//point k join the S
for (j=1;j<n;j++) //将k扩充到红点后,剩余蓝点集的估计距离可能由于增加了新红点k而减小,此时必须调整相应蓝点的估计距离。对于任意的蓝点j,若k由蓝变红后使D[j]变小,则必定是由于存在一条从s到j且包含新红点k的更短路径:P=<s,…,k,j>。且D[j]减小的新路径P只可能是由于路径<s,…,k>和边<k,j>组成。所以,当length(P)=D[k]+w<k,j>小于D[j]时,应该用P的长度来修改D[j]的值。
if((!s[j])&&(d[j]>d[k]+w[k][j]))
{d[j]=d[k]+w[k][j];p[j]=k;}

}
cout<<"从源点到其它顶点的最短距离依次如下:";
for(i=1;i<n;i++) cout<<d[i]<<" ";
}

以上二个代码都是完整可以使用的,楼主喜欢哪个就用那个吧。自己还是可以仔细分析下代码。
晓_筱_潇
2010-11-03 · 超过17用户采纳过TA的回答
知道答主
回答量:87
采纳率:0%
帮助的人:56.3万
展开全部
就是两个坐标点算距离的吗?
是的话就简单了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式