数据结构与算法 ~ 图 ~ 最短路径 ~ 贝尔曼-福特算法(图采用邻接矩阵储存)
·
数据结构与算法 ~ 图 ~ 最短路径 ~ 贝尔曼-福特算法(图采用邻接矩阵储存)
/*graph---bellman-ford*/
#include<stdlib.h>
#include<stdio.h>
#define MAX 10
struct vexnode{
int visited;/*访问标志*/
}vex[MAX];
int array[MAX][MAX];/*存放权值*/
int vexnum=-1;
/*创建图的邻接矩阵*/
void create(){
int source,destination,weight,max;
int i,j;
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
array[i][j]=999;
printf("\n===创建图===\n");
printf("\n请输入弧的信息:起点 终点 权值(退出-1):");
scanf("%d%d%d",&source,&destination,&weight);
while (source!=-1){
array[source][destination]=weight;
array[destination][source]=weight;
/*获得当前最大的结点信息*/
max=(source>destination)?source:destination;
if (max>vexnum)
vexnum=max;
printf("\n请输入弧的信息:起点 终点 权值(退出-1):");
scanf("%d%d%d",&source,&destination,&weight);
}/*while*/
printf("\n===图创建结束===\n");
}/*create*/
void Print(){
int i,j,k;
printf("\n===当前图 ====");
printf ("\n 矩阵 :");
for(i=1;i<=vexnum;i++)
printf("%10d",i);
printf("\n");
for(i=1;i<=vexnum;i++){
printf("%10d:",i);
for(j=1;j<=vexnum;j++){
printf("%10d",array[i][j]);
}
printf("\n");
}/*for*/
printf("\n===图输出结束====");
}/*Print*/
/*计算从e到各顶点的最短路径*/
void BellmanFord(int e){
int i,j,min,temp,k=0;
int bellmanford[MAX];
/*设置bellmanford数组用于存放从e到各结点的最短路径*/
for(i=1;i<=vexnum;++i){
if (i==e) bellmanford[i]=0;
else bellmanford[i]=999;
}/*for*/
/*按照每个顶点开始遍历所有的结点,贝尔曼-福特算法*/
for (i=1;i<=vexnum;i++){
for (j=i+1;j<=vexnum;j++){
if (array[i][j]!=999){
if (bellmanford[i]+array[i][j]<bellmanford[j]){
printf("\n\n%d--b[%d]+[%d][%d]=%d+%d=%d < b[%d]=%d",++k,i,i,j,bellmanford[i],array[i][j],bellmanford[i]+array[i][j],j,bellmanford[j]);
bellmanford[j]=bellmanford[i]+array[i][j];
printf("\n更新b[%d]=%d",j,bellmanford[i]+array[i][j]);
}
if (bellmanford[j]+array[j][i]<bellmanford[i]){
printf("\n%d--b[%d]+[%d][%d]=%d+%d=%d < b[%d]=%d",++k,j,j,i,bellmanford[j],array[j][i],bellmanford[j]+array[j][i],i,bellmanford[i]);
bellmanford[i]=bellmanford[j]+array[j][i];
printf("\n更新[%d]=%d",i,bellmanford[j]+array[j][i]);
}
}
}/* for int j*/
}/* for int i*/
/*输出bellman-ford数组*/
for (i=1;i<=vexnum;i++){
printf("\n[%d]=%d",i,bellmanford[i]);
}
}/*BellmanFord*/
int main(){
int e;
create();
Print();
while(1){
printf("\n请输入起始点(exit for -1):");
scanf("%d",&e);
if (e==-1)
break;
else if (e<0||e>vexnum)
printf("\n输入的起始点错误\n");
else BellmanFord(e);
}/*while*/
system("pause");
exit(0);
}/*main*/
运行,输入图的信息
===创建图===
请输入弧的信息:起点 终点 权值(退出-1):1 2 9
请输入弧的信息:起点 终点 权值(退出-1):1 3 2
请输入弧的信息:起点 终点 权值(退出-1):2 3 6
请输入弧的信息:起点 终点 权值(退出-1):2 4 3
请输入弧的信息:起点 终点 权值(退出-1):2 5 1
请输入弧的信息:起点 终点 权值(退出-1):3 4 2
请输入弧的信息:起点 终点 权值(退出-1):3 6 9
请输入弧的信息:起点 终点 权值(退出-1):4 5 5
请输入弧的信息:起点 终点 权值(退出-1):4 6 6
请输入弧的信息:起点 终点 权值(退出-1):5 6 3
请输入弧的信息:起点 终点 权值(退出-1):5 7 7
请输入弧的信息:起点 终点 权值(退出-1):6 7 4
请输入弧的信息:起点 终点 权值(退出-1):-1 -1 -1
===图创建结束===
显示输入的结果:
===当前图 ====
矩阵 : 1 2 3 4 5 6 7
1: 999 9 2 999 999 999 999
2: 9 999 6 3 1 999 999
3: 2 6 999 2 999 9 999
4: 999 3 2 999 5 6 999
5: 999 1 999 5 999 3 7
6: 999 999 9 6 3 999 4
7: 999 999 999 999 7 4 999
===图输出结束====
确定开始结点,开始运行算法
请输入起始点(exit for -1):1
1--b[1]+[1][2]=0+9=9 < b[2]=999
更新b[2]=9
2--b[1]+[1][3]=0+2=2 < b[3]=999
更新b[3]=2
3--b[3]+[3][2]=2+6=8 < b[2]=9
更新[2]=8
4--b[2]+[2][4]=8+3=11 < b[4]=999
更新b[4]=11
5--b[2]+[2][5]=8+1=9 < b[5]=999
更新b[5]=9
6--b[3]+[3][4]=2+2=4 < b[4]=11
更新b[4]=4
7--b[3]+[3][6]=2+9=11 < b[6]=999
更新b[6]=11
8--b[4]+[4][6]=4+6=10 < b[6]=11
更新b[6]=10
9--b[5]+[5][7]=9+7=16 < b[7]=999
更新b[7]=16
10--b[6]+[6][7]=10+4=14 < b[7]=16
更新b[7]=14
一共进行了10次更新,下面是最终的结果
[1]=0
[2]=8
[3]=2
[4]=4
[5]=9
[6]=10
[7]=14
表示从结点1到其他结点的最短路径
更多推荐



所有评论(0)