算法步骤(该算法要求边的权值不能为负!!!解决负值的问题需要用到Bellman-Ford算法):
1 :从要找的起点比如A出发,找出A距离其他点路径最短的那个点比如为B,标记访问。(A无法到达的点是为距离无限大)
2:通过B点,更新A通过B点到其他点的距离,找出这时到其它点(没有标记访问的)最短的距离,记录该点比如为C,标记访问。
3:通过C点,重复操作步骤2
代码(该代码用邻接矩阵来存图,当图很大的时候,这种方法效率低):
#include<iostream>
using namespace std;
#define MAX 9999
int n;
int Map[2017][2017];//存图
int visit[2017];//访问标记
int d[2017];//源点到各点最短距离
/*初始化*/
void init(){
cout<<"how many node:?\n";
cin>>n;
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>Map[i][j];
if(Map[i][j]==0)//没有记录到即无法到达,距离设为足够大
Map[i][j]=MAX;
}
}
/*算法*/
void dijkstra(int x){
int i,j,Min,p;
for(i=1;i<=n;i++)
d[i]=Map[x][i];
visit[x]=1;//记录自己已被访问
d[x]=0;//自己到自己为0
for(i=1;i<n;i++)//循环n-1遍就可以将所有点记录了
{
Min=MAX;
for(j=1;j<=n;j++)//找出当前最短的边
if(!visit[j] && Min>d[j])//没找过的点
{
p=j;
Min=d[j];
}
visit[p]=1;//记录该点
for(j=1;j<=n;j++)
if(!visit[j] && Min+Map[p][j]<d[j])//更新操作
d[j]=Min+Map[p][j];
}
cout<<"点1到各点最短距离依次为:"<<endl;
for(int i=1;i<=n;i++)
cout<<i<<"-------"<<d[i]<<endl;
}
/*测试数据
5
0 0 1 0 3
0 0 0 5 5
1 0 0 1 2
0 5 1 0 2
3 5 2 2 0
3
0 1 2
1 0 3
2 3 0
*/
int main(){
init();
cout<<"----"<<endl;
dijkstra(1);
return 0;
}