基于邻接矩阵的dijkstra算法
基于邻接矩阵的dijkstra算法
一、定义邻接矩阵map、路径距离dist数据结构
二、初始化值
三、在V-S集合中依照贪心策略寻找最接近源点的结点,并加入S
四、把此结点直接对源点的距离与经它的相邻结点过来的距离相比,若直接更近则直连,经相邻结点更近则选此路径,并更新dist表
五、直到所有结点均被纳入邻接点集合S
#include <iostream>
using namespace std;
void Dijkstra(int u);
const int N = 100; // 城市个数可修改
const int INF = 1e7; // infinite
int map[N][N]; // 邻接矩阵
int dist[N]; // 源点至目标距离表
bool flag[N]; // 在不在已连接图里
int p[N]; // 是否相邻接
int n,m; // 城市个数、路线条数
int t; // 寻找接近源点的位置
int main(){
int u,v,w,st;
cout << "请输入城市个数: "<<endl;
cin>> n;
cout << "请输入路线条数: "<<endl;
cin>> m;
cout << "输入有向连接的城市和权值: "<<endl;
// 先初始化邻接矩阵
for( int i = 1; i <= n; ++i){
for( int j = 1; j <= n; ++j){
map[i][j] = INF;
}
}
while(m--){
cin >> u >> v >> w;
map[u][v] = min(map[u][v],w);
}
cout <<map[5][3]<<" "<<map[5][4]<<endl;
cout << "请输入小明所在位置: "<<endl;
cin >> st;
Dijkstra(st);
cout << "小明所在位置: "<<st<<endl;
for(int i = 1; i <= n; ++i){
cout << "小明: "<<st << " - "<< "要去的位置: "<<i;
if(dist[i] == INF)
cout << " sorry , no way."<<endl;
else
cout << "小明与"<<" "<<i<<"最短距离为"<<dist[i]<<endl;
}
return 0;
}
void Dijkstra(int u){
//对路径表、点归属标志表、是否邻接表初始化
for( int i = 0; i < n; ++i){
dist[i] = map[u][i];
flag[i] = false;
if(dist[i] == INF)
p[i] = -1;
else
p[i] = u;
}
// 初始化自己
dist[u] = 0;
flag[u] = true;
// 开始寻找离源点最近的点
for(int i = 1; i <= n; ++i){
int temp = INF; // 存储临时距离
t = u; // 寻找从u源点开始
for( int j = 1; j <= n; ++j){
if(!flag[j] && dist[j] < temp){
temp = dist[j]; // 更新temp,看以后有没有比此结点离源点更近
t = j; // 寻找光标落在此处
}
}
if( t == u) // 光标没走出去
return; // 没找到离源点更近的结点
else
flag[t] = true;
for( int j = 1; j <= n; ++j){
if(!flag[j] && map[i][j] < INF){
if(dist[j] > (dist[t] + map[t][j]))
dist[j] = dist[t] + map[t][j];
p[j] = t;
}
}
}
}