最短路Dijkstra算法

3 篇文章 0 订阅
#include <iostream>
#include <stack>
using namespace std;
const int MAX = 65535;
const int graph[9][9] = {
//v:   0  1    2   3   4   5   6   7   8     V:
    {  0,  1,  5,MAX,MAX,MAX,MAX,MAX,MAX}, //0
    {  1,  0,  3,  7,  5,MAX,MAX,MAX,MAX}, //1
    {  5,  3,  0,MAX,  1,  7,MAX,MAX,MAX}, //2
    {MAX,  7,MAX,  0,  2,MAX,  3,MAX,MAX}, //3
    {MAX,  5,  1,  2,  0,  3,  6,  9,MAX}, //4
    {MAX,MAX,  7,MAX,  3,  0,MAX,  5,MAX}, //5
    {MAX,MAX,MAX,  3,  6,MAX,  0,  2,  7}, //6
    {MAX,MAX,MAX,MAX,  9,  5,  2,  0,  4}, //7
    {MAX,MAX,MAX,MAX,MAX,MAX,  7,  4,  0}  //8
};

int main(){
    int dist[9] = {0,1,5,MAX,MAX,MAX,MAX,MAX,MAX};
    int path[9] = {0};
    bool collected[9] = {false,false,false,false,false,false,false,false,false};    
    int final[9] = {1,0,0,0,0,0,0,0,0};//收录集合 
    int min,w,k;
    //开始主循环,每次求得Vo到某个V顶点的最短路径 
    for(int i = 1;i<9;i++){
        min = MAX;
        //寻找距离VO最近的顶点 
        for(w=0;w<9;w++){
            if(!final[w] && dist[w] < min){
                k=w;
                min = dist[w];  
            } 
        }
        cout<<"收录的顶点:"<<k<<endl; 
        final[k] = 1;//将目前找到的最近的顶点设置为1 
        for(w=0;w<9;w++){//修正当前最短路径以及距离
            if(!final[w] && (min+graph[k][w] < dist[w])){
                dist[w] = min + graph[k][w];
                cout<<"更新顶点 w:"<<w<<",距离:"<<dist[w]<<endl; 
                path[w] = k;
                cout<<"路径顶点:"<<path[w]<<endl; 
            }
        } 
    }
    for(int i:path){
        cout<<"i:"<<i<<'\t';
    }
    cout<<endl;
    for(int i:dist){
        cout<<"i:"<<i<<'\t';
    }
    //下面输出V0-V8之间的路径:,V0到其他定点路径同理 
    int node_index = 8;//V8的下标
    stack<int> route;
    cout<<endl;
    while(path[node_index] != 0){//前驱不是0则继续 
        route.push(path[node_index]);
        node_index = path[node_index];
    } 
    cout<<endl<<"V0->V8  node:0"; 
    int size = route.size();
    for(int i=0;i<size;i++){
        cout<<" -> "<<route.top();
        route.pop();
    }
    return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是使用Dijkstra算法求解最短路径的MATLAB代码示例: ```matlab function [dist, path] = dijkstra(adjMatrix, startNode) numNodes = size(adjMatrix, 1); % 初始化距离数组 dist = inf(1, numNodes); dist(startNode) = 0; % 初始化路径数组 path = cell(1, numNodes); path{startNode} = startNode; % 创建一个标记数组,用于记录节点是否已被访问 visited = false(1, numNodes); % 运行Dijkstra算法 for i = 1:numNodes-1 % 找到当前距离最小的节点 [~, currentNode] = min(dist .* ~visited); visited(currentNode) = true; % 更新与当前节点相邻的节点的距离 neighbors = find(adjMatrix(currentNode, :)); for j = neighbors if ~visited(j) && dist(currentNode) + adjMatrix(currentNode, j) < dist(j) dist(j) = dist(currentNode) + adjMatrix(currentNode, j); path{j} = [path{currentNode}, j]; end end end end ``` 使用示例: ```matlab % 定义一个邻接矩阵表示图的连接关系 adjMatrix = [ 0 3 0 4 0; 3 0 5 0 0; 0 5 0 2 6; 4 0 2 0 1; 0 0 6 1 0 ]; % 调用Dijkstra算法求解最短路径 [startNode, endNode] = deal(1, 5); [dist, path] = dijkstra(adjMatrix, startNode); % 输出结果 disp(['从节点', num2str(startNode), '到节点', num2str(endNode), '的最短距离为:', num2str(dist(endNode))]); disp(['最短路径为:', num2str(path{endNode})]); ``` 这段代码实现了Dijkstra算法的逻辑,并且可以根据输入的邻接矩阵和起始节点,求解出最短路径的距离和路径。希望能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值