Dijkstra最短路径算法

复制代码
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

const int  MAXINT = 32767;
const int MAXNUM = 10;
int dist[MAXNUM];
int prev[MAXNUM];
int len;
int v00 = 0;
int A[MAXNUM][MAXNUM];

void input(){
    cin >> len;
    for (int i = 0 ; i < len ; i++){
        for (int j = 0 ; j < len ; j++){
            int a;
            cin >> a;
            A[i][j] = a;
        }
    }
}

void Dijkstra(int v0)
{
    bool S[MAXNUM];                                  // 判断是否已存入该点到S集合中
    int n=MAXNUM;
    for(int i=0; i<n; ++i) {
        dist[i] = A[v0][i];
        S[i] = false;                                // 初始都未用过该点
        if(dist[i] == MAXINT)    
            prev[i] = -1;
        else 
            prev[i] = v0;
    }
    dist[v0] = 0;
    prev[v0] = -1;
    S[v0] = true;
    for(int i=1; i<len; i++){
        int mindist = MAXINT;
        int u = v0;                            // 找出当前未使用的点j的dist[j]最小值
        for(int j=0; j<len; ++j){
            if((!S[j]) && dist[j]<mindist){
                u = j;                             // u保存当前邻接点中距离最小的点的号码 
                mindist = dist[j];
            }
        }
        S[u] = true; 
        for(int j=0; j<len; j++){
            if((!S[j]) && A[u][j]<MAXINT){
                if(dist[u] + A[u][j] < dist[j])     //在通过新加入的u点路径找到离v0点更短的路径  
                {
                    dist[j] = dist[u] + A[u][j];    //更新dist 
                    prev[j] = u;                    //记录前驱顶点 
                }
            }
        }
    }
}

void output(){
    for(int i = 0 ; i < len ; i++){
        cout <<v00<< " to "<< i <<"'s minDis="<< dist[i] <<" path =( ";
        std::vector<int> p;
        int t = i;
        while(t != -1){
            //cout << t<<" ";
            p.push_back(t);
            t = prev[t];
        }
        //cout << "p size="<<p.size()<<endl;
        reverse(p.begin(), p.end());
        for(int j = 0 ; j < p.size() ; j++){
            cout << p[j] << " ";
        }
        cout << ")"<<endl;
    }
}

int main(){
    input();
    Dijkstra(v00);    
    output();
    return 0;
}
复制代码

 

posted @   Shiyu_Huang  阅读(174)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示