迪杰斯特拉-最短路径算法

#include <iostream>
#include <string>
#include <stack>
#include <vector>
#include <iomanip>
using namespace std;
//变量
int L[10]={0};//L(i)//记录路径
int exsist[10]={0};//判断点是否存在的集合
int pre[10]={0};//记录前导点
//vector<int> path;//记录最短路径结点//后来发现思路不对//每次记录min点会出现不连续的路径
int jiedian;//结点个数//从V1开始
//变量

//判断点是否存在
bool ifexsist(int exsist[10],int judgepoint){
    if(exsist[judgepoint]==1) return 1;
    else return 0;
}
//找出min(L(i))
int minLi(int L[10],int exsist[10]){
    int temp;
    for(int i = 1;i<=jiedian;i++){
        if(exsist[i]==1) {
            temp = i;
            break;
        }//min赋初值
    }
    int min=temp;
    for(int i = 1; i <=jiedian; i++){
        if((exsist[i]==1) && (L[i]<L[min])){
            min = i;
        }
    }
    return  min;
    
}

int main()
{

    for(int i = 0; i < 10; i++) L[i]=999;
    for(int i = 0; i < 10; i++) exsist[i]=1;
    cout<<"请输出图中结点个数(<10):";
    cin>>jiedian;
    int tu[10][10]={0};
    cout<<"请输入边和权值,输入0,0,0时结束"<<endl;
    int b1=1,b2,q;
    while(b1+b2+q){
        cin>>b1>>b2>>q;
        tu[b1][b2]=q;
        //tu[b2][b1]=q;
    }
    cout<<"图的邻接矩阵如下:"<<endl;

    for(int i = 1;i <= jiedian;i++){
        cout<<"V"<<i<<"  ";
        for(int j=1; j<= jiedian; j++){
            cout<<setw(4)<<tu[i][j]<<" ";
        }
        cout<<endl;
    }
    
    int begin,end;//起点和终点
    cout<<"输入起点终点"<<endl;
    cin>>begin>>end;
    
    L[begin] = 0;
    
    while(1){
        int min = minLi(L, exsist);
        //出度
        if(min == end) break;
        for(int m=1; m<=jiedian; m++){
            //if(m==min) continue;
            if(tu[min][m]!=0){
                //先判断临点存在
                if(ifexsist(exsist, m)){
                    int temp = L[min] + tu[min][m];
                    //替换L
                    if(temp < L[m]) {
                        pre[m]=min;
                        L[m]=temp;
                    }
                }
            }
                
        }
        //所有临点判断完
        exsist[min]=0;
        //path.push_back(min);
    }
    int t = end;
    cout<<"最短路径为:"<<endl;
    while(1){
        
        cout<<"V"<<t;
        if(t ==begin || t==0) {
            break;
        }
        else cout<<"<-";
        t = pre[t];
        
    }
    cout<<endl<<"最短路径长度为:"<<endl;
    cout<<L[end]<<endl;
    return 0;
    
}

/*
 1 6 100
 1 5 30
 1 3 10
 2 3 5
 3 4 50
 4 6 10
 5 4 20
 5 6 60
 0 0 0
*/




迪杰斯特拉算法是一种用于计图中单源最短路径的贪心算法。它的主要思想是从起点开始,逐步扩展到其他节点,直到到达终点或者所有节点都被扩展。在扩展的过程中,维护一个距离数组,记录起点到每个节点的最短距离,同时维护一个集合,记录已经找到最短路径的节点。每次从未找到最短路径的节点中选择距离起点最近的节点进行扩展,更新距离数组中的距离值。重复这个过程,直到到达终点或者所有节点都被扩展。 以下是一个使用迪杰斯特拉算法求解最短路径的Python代码示例: ```python import heapq def dijkstra(graph, start, end): # 初始化距离数组和已找到最短路径的节点集合 dist = {node: float('inf') for node in graph} dist[start] = 0 visited = set() # 使用堆优化的Dijkstra算法 heap = [(0, start)] while heap: (d, node) = heapq.heappop(heap) if node in visited: continue visited.add(node) if node == end: return d for neighbor, cost in graph[node].items(): if neighbor in visited: continue new_dist = dist[node] + cost if new_dist < dist[neighbor]: dist[neighbor] = new_dist heapq.heappush(heap, (new_dist, neighbor)) # 如果无法到达终点,返回None return None # 示例图 graph = { 'A': {'B': 5, 'C': 1}, 'B': {'A': 5, 'C': 2, 'D': 1}, 'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8}, 'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6}, 'E': {'C': 8, 'D': 3}, 'F': {'D': 6} } # 求解A到F的最短路径 print(dijkstra(graph, 'A', 'F')) # 输出:8 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值