关于最短路径问题,望版主能给予帮助
关于最短路径的问题(迪杰斯特拉算法)不是很明白,希望能举一到两个例子(邻接表或邻接矩阵),并附带说明,不胜感激
#include <stdio.h>
#include <stdlib.h>
#define MAXLENTH 1000
int cost[7][7]; //存放图的邻接矩阵
int dist[7]; //存放最顶点的最短路径
///////////////////////////////////////////////////////////////////////
//
// 函数名 : creategraph
// 功能描述 : 用数组的方法创建图(node存放的是比如1 2 3 意思是1->2之间的距离为3)
// 参数 : int * node
// 参数 : int num
// 返回值 : void
//
///////////////////////////////////////////////////////////////////////
void creategraph(int * node,int num)
{
int from;
int to ;
int i;
for(i=0;i<num;i++)
{
from=node[3*i];
to=node[3*i+1];
cost[from][to]=node[3*i+2];
}
}
///////////////////////////////////////////////////////////////////////
//
// 函数名 : shortestpath
// 功能描述 : dijkstra算法
// 参数 : int begin
// 参数 : int num
// 返回值 : void
//
///////////////////////////////////////////////////////////////////////
void shortestpath(int begin,int num)
{
int selected[7];
int min;
int s;
int i;
int j;
for(i=2;i<=num;i++)
{
dist[i]=cost[begin][i];//(dist初始化为存放从begin 这一点到其他顶点值)
selected[i]=0; //一个指示的数组,1表明算过了,0是初始值
}
dist[begin]=0;
selected[begin]=1;
printf("顶点1 2 3 4 5 6\n");
for(i=1;i<=num;i++)
{
printf(" %4d ",dist[i]); //初始化的路径长短.
}
printf("\n");
for(i=1;i<=num-1;i++)
{
min=MAXLENTH;
for(j=1;j<=num;j++)//从dist中找到最小的并且未标记的那个顶点,并标志为已算过
{
if(min > dist[j] && selected[j] == 0)
{
s=j;
min=dist[s];
}
}
selected[s]=1;
for(j=1;j<=num;j++) //根据找到的顶点进行修改dist数组,即原来的值dist[j]与(先到与经过刚刚找到的顶点s值dist[s],加上从s到j的距离cost[s][j])
{
if(dist[j] > (dist[s]+cost[s][j] )&& selected[j]==0)//比较发现先经过s再到j的距离比较小(且未标记过)则进行修改
{
dist[j]=dist[s]+cost[s][j];
}
printf(" %4d ",dist[j]);
}
printf("\n");
}
}
void main()
{
int i;
int j;
int node[7][3]=
{
{1,2,35},
{2,3,45},
{2,4,30},
{3,5,25},
{4,5,45},
{4,6,130},
{5,6,100}
};
for(i=1;i<=6;i++)
for(j=1;j<=6;j++)
{
cost[i][j]=MAXLENTH; //图的邻接矩阵的初始化.MAXLENTH=1000(意为无穷, 顶点之间不可达)
}
creategraph(node,6); //创建图
printf("带权图的矩阵\n");
for(i=1;i<=6;i++) //输出邻接矩阵
{
for(j=1;j<=6;j++)
printf(" %4d ",cost[i][j]);
printf("\n");
}
printf("从顶点1到各顶点最短距离计算过程\n");
shortestpath(1,6);
}