基于邻接矩阵的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;
            }
        }
    }
}

转载于:https://www.cnblogs.com/sharp456/p/7795549.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值