下面是一个带权值的连通图,就用这个图为例子来实现最短路径
原理就不在说了 百度上面有 直接从代码开始
首先定义头文件和需要的数据
map表示带权值的连通图
path[i]表示从起点到i路径上所有的顶点 如经过j顶点,则path[i][起点],path[i][j],path[i][i]都为1其余的都为0
dis表示从起点到每个顶点的最短路径
find表示是否找到起点到其他节点的最短路径
#include<stdio.h>
#define SIZE 6
#define MAX 10000
//定义带权值的邻接矩阵MAX表示不直接相连
int map[SIZE][SIZE]={
{MAX,MAX,10,MAX,30,100},
{MAX,MAX,5,MAX,MAX,MAX},
{10,5,MAX,100,MAX,MAX},
{MAX,MAX,100,MAX,20,10},
{30,MAX,MAX,20,MAX,60},
{100,MAX,MAX,10,60,MAX}
} ;
int path[SIZE][SIZE];
int dis[SIZE];
int find[SIZE];
ShortestPath函数实现最短路径的寻找
//寻找最短路径
void ShortestPath(int start)
{
//初始化path和dis 和find
for(int i=0;i<SIZE;i++)
{
dis[i]=map[start][i];
for(int j=0;j<SIZE;j++)
{
path[i][j]=0;
}
if(dis[i]<MAX)
{
//start 到 i的任意路径都包括i和start这两个点
path[i][i]=1;
path[i][start]=1;
}
}
dis[start]=0;//起始点到自身路径长度为0
find[start]=1;//起始点到起始点的最短路径已经找到加入find
//n个节点需要找到起点到其他n-1个点的最短路径所以循环次数为SIZE-1
for(int i=1;i<SIZE;i++)
{
int min=MAX;
int tempNode=-1;
//找到当前节点权值最小的路径
for(int j=0;j<SIZE;j++)
{
if(find[j]==0&&dis[j]<min)
{
min=dis[j];
tempNode=j;
}
}
find[tempNode]=1;//找到的最小路径加入到find
//从刚刚找到最短路径的节点出发找到更小的路径并更新路径长度
for(int j=0;j<SIZE;j++)
{
if(find[j]==0&&min+map[tempNode][j]<dis[j])
{
dis[j]=min+map[tempNode][j];
for(int k=0;k<SIZE;k++)
{
path[j][k]=path[tempNode][k];
}
path[j][j]=1;
}
}
}
}
最后把main函数和print函数补充上
//输出最短路径
void print(int start)
{
for(int i=0;i<SIZE;i++)
{
printf("the shortest path from %d to %d is:%d\n",start,i,dis[i]);
}
}
int main()
{
ShortestPath(0);
print(0);
return 0;
}
接下来就是运行效果图:
可以手动找到最短路径和结果比较是完全相同的