关于最短路径算法高手来看一下(50分)

  • 主题发起人 主题发起人 snowind521
  • 开始时间 开始时间
S

snowind521

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是一段用c语言编的最短路径算法的程序,谁能帮我把它改成delphi的?

#include <stdio.h>
#include <8_1.c> /*引入邻接矩阵创建程序*/
typedef enum{FALSE,TRUE} boolean;/*false为0,true为1*/
typedef int dist[m]; /* 距离向量类型*/
typedef int path[m]; /* 路径类型*/

/*------------Dijkstra最短路径算法-----------*/

void spath_dij(mgraph g,int v0,path p,dist d)
{ boolean final[m]; /*表示当前元素是否已求出最短路径*/
int i,k,j,v,min,x;

/* 第1步 初始化集合S与距离向量d */
for (v=0;v<g.n;v++)
{ final[v]=FALSE;
d[v]=g.edges[v0][v];
if (d[v]<FINITY && d[v]!=0) p[v]=v0; else p[v]=-1; /* v无前驱 */
}
final[v0]=TRUE; d[v0]=0; /* 初始时s中只有v0一个结点 */
/* 第2步 依次找出n-1个结点加入S中 */
for (i=1;i<g.n;i++)
{ min=FINITY;
for (k=0;k<g.n;++k) /*找最小边入结点*/
if (!final[k] && d[k]<min) {v=k;min=d[k];} /* !final[k] 表示k还在V-S中 */
printf("/n%c---%d/n",g.vexs[v],min); /*输出本次入选的顶点入距离*/
if (min==FINITY) return;
final[v]=TRUE; /* V加入S*/

/*第3步 修改S与V-S中各结点的距离*/
for (k=0;k<g.n;++k)
if ( !final[k] && (min+g.edges[v][k]< d[k]) )
{ d[k]=min+g.edges[v][k];
p[k]=v;
}
}/* end for */
}
void print_gpd(mgraph g,path p,dist d)
{ /*输出有向图的最短路径*/
int st[20],i,pre,top=-1;
for (i=0;i<g.n;i++)
{ printf("/nDistancd: %7d , path:" ,d);
st[++top]=i;
pre=p;
while (pre!=-1) /*从第i个顶点开始向前搜索最短路径上的顶点*/
{ st[++top]=pre;
pre=p[pre];
}
while (top>0)
printf("%2d",st[top--]);
}
}
/*---------- 主程序 ------------*/
void main()
{ mgraph g; /* 有向图 */
path p; /* 路径向量 */
dist d; /* 最短路径向量 */
int v0;
creatmgraph(&g); /*创建有向网的邻接矩阵*/
print(g); /*输出图的邻接矩阵*/
printf("/n");
printf("please input the source point v0:");
scanf("%d",&v0); /*输入源点*/
spath_dij(g,v0,p,d); /*求v0到其他各点的最短距离*/
/*输出V0到其它各点的路径信息及距离*/
print_gpd(g,p,d);
}
 
似乎还需要 8_1.c的那个东西 不然这些结构类怎么改啊!

mgraph g; /* 有向图 */
path p; /* 路径向量 */
dist d; /* 最短路径向量 */
int v0;
creatmgraph(&g); /*创建有向网的邻接矩阵*/
 
这个是那个8.1c
#include <stdio.h>
#define m 100 /*最大顶点数*/
#define FINITY 5000 /*此处设5000为最大边价代*/
typedef char vertextype; /*顶点值类型*/
typedef int edgetype; /*权值类型*/
typedef struct{
vertextype vexs[m]; /*顶点信息域*/
edgetype edges[m][m]; /*邻接矩阵*/
int n,e; /*图中顶点总数与边数*/
} mgraph; /*邻接矩阵表示的图类型*/

void creatmgraph(mgraph *g)
{int i,j,k,w; /*建立无向网络的邻接矩阵存储结构*/
printf("please input n and e:/n");
scanf("%d%d",&g->n,&g->e); /*输入图的顶点数与边数*/
getchar();
printf("please input vexs/n");
for(i=0;i<g->n;i++) /*输入图中的顶点值*/
g->vexs=getchar();

for(i=0;i<g->n;i++) /*初始化邻接矩阵*/
for(j=0;j<g->n;j++)
if (i==j) g->edges[j]=0;
else g->edges[j]=FINITY;
printf("please input edges:/n");
for (k=0;k<g->e;k++) /*输入网络中的边*/
{scanf("%d%d%d", &i,&j,&w);
g->edges[j]=w;

}
}

void print(mgraph g)
{/*辅助函数,输出邻接矩阵表示的图g*/
int i,j;
for (i=0;i<g.n;i++)
printf("%c ",g.vexs);
printf("/n");
for (i=0;i<g.n;i++)
{ for (j=0;j<g.n;j++)
printf("%6d",g.edges[j]);
printf("/n");
}
}


 
先看算法论文
 
解决单源点最短路径问题的迪杰斯特拉(Dijkstra)算法思想如下:

设S为最短路径以确定的顶点集,V-S是最短路径尚未确定的顶点集。D[v]为u到v的最短路径长度。

① 初始时,将源点u放入S中;

② 初始D[v],v∈V-S,D[v]=w<u,v> ;

③ 选取点k使D[k]=min{D[v],v∈V-S };

④ 将k添入S;

⑤ 若V-S不空,重新计算D[v]值,其中v∈V-S

if(D[v]>D[k]+w<k,v>)

{ D[v]=D[k]+w<k,v>;

并修改源点到v的路径上的点为源点到k的路径加上点v};

⑥ 若V-S为空,则结束,否则重复③。
 
看看這裡
http://www.delphibbs.com/keylife/iblog_show.asp?xid=684
 

Similar threads

后退
顶部