1.将所有顶点分为两部分,一本分是P放置已经访问过的顶点,另一部分是Q存放还没有访问过的顶点;设置一个book[]数组,值为0表示顶点未被访问,值为1表示顶点已经被访问过了;
2.设置dist[],dist[]表示源顶点到各个顶点之间的距离,其中源顶点到自身为0,其他顶点如果和源顶点相连则值为e[][],否则为最大值
3.找出离源点最近的节点u,设置节点u被访问过,考察所有以u为起点的边,进行松弛操作。比如存在从u到v的边,如果dist[u]+e[u][v]<dist[v],则用dist[u]+e[u][v]替代dist[v]
4.重复操作3,一直到Q中的所有点加入到P中
#include<iostream>
using namespace std;
int main()
{
int book[10]={0};
//标记数组,0表示该点没有被访问,1表示被访问过
int dist[10];
//表示第一个节点到各个节点的距离
int e[10][10];
//两个节点之间的距离
int n,m,enu,a,b,min=100,u;
cin>>n>>m;
//n表示节点的数量,m表示边的数量
for(int i=0;i<n;++i)
//初始化两个节点之间的距离
{
for(int j=0;j<n;++j)
{
if(i==j)
//节点到自己的距离是0
e[i][j]=0;
else //两个节点之间的距离为最大值
e[i][j]=100;
}
}
for(int j=0;j<m;++j)
//读入边
{
cin>>enu>>a>>b;
e[a][b]=enu;
}
for(int q=0;q<n;++q)
//初始化dist[],为第一个节点到各个节点之间的距离
dist[q]=e[0][q];
book[0]=1;
for(int k=0;k<n-1;++k)
//迪杰斯特拉算法核心
{
for(int h=0;h<n;++h)
//找到离第一个节点最短的节点
{
if(book[h]==0&&dist[h]<min)
{
min=dist[h];
u=h;
}
}
book[u]=1;
for(int l=0;l<n;++l)
{
if(e[u][l]<100)
{
if(dist[l]>dist[u]+e[u][l])
dist[l]=dist[u]+e[u][l];
}
}
}
for(int p=0;p<n;++p)
cout<<" "<<dist[p];
system("Pause");
return 0;
}