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);
}
#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);
}