问一个数据结构的问题, 图的最短路径

AnnyBJ 2003-12-12 08:23:30
图的最短路径,用Dijcstra算法求的是顶点V0到其它n-1个顶点的最短路径的长度
我想把它改成求vi 到 vj 的最短路径.并记录所走路径的顶点序列.
弄了一天了也没做出来.
相关代码如下,老鸟帮偶看看吧.图是用邻接矩阵存储的.

void shortpath(float **G,int vi,int vj,int *dist,int **path)  
 //求v到其它每个顶点的最短路径,dist记录最短路径长度,path记录顶点序列.
{
int i,j,wm,u,num=1;
int *S = new int [n];
for(i=0;i<n;i++)
{
 dist[i]=G[vi][i];
 S[i]=0;                //数组dist及集合S赋初值
}
for(i=0;i<n;i++)
 for(j=0;j<n;j++)
  path[i][j]=-1;
 
S[vi] = 1;                 //把顶点v加入集合S中
int s = 0;
path[vj][s]=vi;

do {
 wm = MAX;
 u = vi;
 for(i = 0;i < n;i++)
 {
     if (S[i] == 0)  
  if (dist[i]<wm)
  {
     u = i;
     wm = dist[i];
  }
 }//for
 S[u] = 1;
 
 for(i = 0;i<n;i++)      //修改所有不属于S中的顶点i的dist[i]的值
 { if (S[i]==0)
   if (dist[u] + G[u][i]<dist[i])
   {
    dist[i] = dist[u]+G[u][i];
    s++;
    path[i][s]=u;
   }
                     }//for
 num++;    
} while(num != n-1);

cout<<endl;
for(i=0;i<n;i++)
{
 cout<<S[i]<<"  ";
}
cout<<endl;
for(i=0;i<n;i++)
{
 if(path[vj][i]!=-1)  
     cout<<path[vj][i]<<"  ";  
}
cout<<endl;
cout<<dist[vj];
cout<<endl;
}//end of shortpath;
...全文
107 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
间谍 2003-12-13
  • 打赏
  • 举报
回复
Warshall算法

该算法的中心思想是:任意两点i,j间的最短距离(记为Dij)会等于从i点出发到达j点的以任一点为中转点的所有可能的方案中,距离最短的一个。即:

Dij=min(Dij,Dik+Dkj,……),1<=k<=5。

这样,我所就找到了一个类似动态规划的表达式,只不过这里我们不把它当作动态规划去处理,而是做一个二维数组用以存放任意两点间的最短距离,利用上述公式不断地对数组中的数据进行处理,直到各数据不再变化为止,这时即可得到A到E的最短路径。

算法如下:

1、 把上述邻接矩阵直接赋值给最短距离矩阵D;

2、 i=1;

3、 j=1;

4、 repeat

5、 c=false; {用以判断第6步是否有某个Dij值被修改过}

6、 Dij=min(Dij,Dik+Dkj,……), k=1 to 5 如果Dij被修改则c=true

7、 I=I+1

8、 J=j+1

9、 Until not c

10、 打印D15

这种算法是产生这样一个过程:不断地求一个数字最短距离矩阵中的数据的值,而当所有数据都已经不能再变化时,就已经达到了目标的平衡状态,这时最短距离矩阵中的值就是对应的两点间的最短距离。
*****************************************************************************
以上内容出自:http://218.22.17.226/infor_edu/drkt/oszt/zltk/yxlw/short.htm


AnnyBJ 2003-12-12
  • 打赏
  • 举报
回复
不好意思,没想到贴出来这么乱,重新写过.

void shortpath(float **G,int vi,int vj,int *dist,int **path)
//求v到其它每个顶点的最短路径,dist记录最短路径长度,path记录顶点序列.
{
int i,j,wm,u,num=1;
int *S = new int [n];
for(i=0;i<n;i++)
{
dist[i]=G[vi][i];
S[i]=0; //数组dist及集合S赋初值
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
path[i][j]=-1;

S[vi] = 1; //把顶点v加入集合S中
int s = 0;
path[vj][s]=vi;

do {
wm = MAX;
u = vi;
for(i = 0;i < n;i++)
{
if (S[i] == 0)  
if (dist[i]<wm)
{
u = i;
wm = dist[i];
}
}//for
S[u] = 1;

for(i = 0;i<n;i++) //修改所有不属于S中的顶点i的dist[i]的值
{ if (S[i]==0)
if (dist[u] + G[u][i]<dist[i])
{
dist[i] = dist[u]+G[u][i];
s++;
path[i][s]=u;
}
}//for
num++;
} while(num != n-1);

cout<<endl;
for(i=0;i<n;i++)
{
cout<<S[i]<<"  ";
}
cout<<endl;
for(i=0;i<n;i++)
{
if(path[vj][i]!=-1)
cout<<path[vj][i]<<" ";
}
cout<<endl;
cout<<dist[vj];
cout<<endl;
}//end of shortpath;

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧