参考资料:啊哈算法第六章:最短路径
《啊哈算法——第六章第二节》
代码:
#include <iostream>
#include <windows.h>
using namespace std;
int book[101], dis[10],n = 6, e[10][10], minn,u,v; //n为顶点个数
int inf = 99999999;
void Dijkstra(int u) //广度优先搜索 u表示当前结点
{
for(int k=1;k<=n-1;k++)
{
//找到与1号顶点最近的点
minn=inf;
for(int i=1;i<=n;i++)
{
if(book[i]==0&&dis[i]<minn)
{
minn=dis[i];
u=i;
}
}
book[u]=1;
for(int v=1;v<=n;v++)
{
if(e[u][v]<inf)
{
if(dis[v]>dis[u]+e[u][v])
{
dis[v]=dis[u]+e[u][v];
}
}
}
}
return;
}
void myPrint(int dis[])
{
for(int i=1;i<=n;i++)
{
cout<<dis[i]<<" ";
}
}
int main()
{
//定义一个二维数组表示顶点之间边
int bian[9][3]={{1,2,1},{1,3,12},{2,3,9},{2,4,3},{3,5,5},{4,3,4},{4,5,13},{4,6,15},{5,6,4}}; //边的个数
int num=sizeof(bian)/sizeof(bian[0]); //边的个数
//初始化二维矩阵e
for(int i=1;i<=num;i++)
{
for(int j=1;j<=num;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
}
}
for(int i=1;i<=num;i++)
{
e[bian[i-1][0]][bian[i-1][1]]=bian[i-1][2];
// e[bian[i-1][1]][bian[i-1][0]]=1;
}
//初始化dis数组。
for(int i=1;i<=num;i++)
{
dis[i]=e[1][i];
}
//book数组初始化
for(int i=1;i<=n;i++)
book[i]=0;
book[1]=1;
Dijkstra(1);
cout<<"源点到各点的最短路径为:"<<endl;
myPrint(dis);
cout<<endl;
system("pause");
return 0;
}
运行结果为:
源点到各点的最短路径为:
0 1 8 4 13 17
请按任意键继续. . .