Dijkstra算法最小堆优化

简介: Dijkstra算法最小堆优化

Dijkstra算法


迪杰斯特拉算法,常用于有权图的单源最短路径问题,即求图中某一顶点到其他各顶点的最短路径

/*  
有权图的单源最短路径问题
*/
#include <iostream>
#include <queue>
using namespace std;
#define MaxVertexNum 10
struct Node
{
    int vertex;
    int dist;
};
struct Graph
{
    int edgenum;
    int vertexnum;
    int edgeList[MaxVertexNum][MaxVertexNum];
    bool visit[MaxVertexNum];
    int path[MaxVertexNum]; // 前驱结点
    int dist[MaxVertexNum]; // 从源点到其他各顶点当前最短路径长度
};
class mycomparison
{
public:
    bool operator()(const Node &a, Node &b)
    {
        return a.dist > b.dist;
    }
};
void BuildGraph(Graph *G)
{
    int start, end;
    cout << "Please enter the number of vertices and edges" << endl;
    cin >> G->vertexnum >> G->edgenum;
    // 图的权重初始化
    for (int i = 1; i <= G->vertexnum; i++)
    {
        G->visit[i] = false;
        G->path[i] = -1;
        G->dist[i] = INT_MAX;
        for (int j = 1; j <= G->vertexnum; j++)
        {
            G->edgeList[i][j] = 0;
        }
    }
    // 输入权重信息
    for (int i = 1; i <= G->edgenum; i++)
    {
        cout << "Please enter the Start number, end number, weight" << endl;
        cin >> start >> end;
        cin >> G->edgeList[start][end];
    }
    cout << endl;
}
void Dijkstra(Graph *G, int v)
{
    // 初始化
    G->visit[v] = true;
    G->dist[v] = 0;
    priority_queue<Node, vector<Node>, mycomparison> minheap;
    Node p;
    for (int i = 1; i <= G->vertexnum; i++)
    {
        if (G->edgeList[v][i])
        {
            G->dist[i] = G->edgeList[v][i];
            G->path[i] = v;
            p.dist = G->dist[i];
            p.vertex = i;
            minheap.push(p);
        }
    }
    while (!minheap.empty())
    {
        // 选出未访问顶点中dist最小的
        int minv = minheap.top().vertex;
        minheap.pop();
        G->visit[minv] = true;
        for (int i = 1; i <= G->vertexnum; i++)
        {
            if (G->edgeList[minv][i] && !G->visit[i] && G->dist[minv] + G->edgeList[minv][i] < G->dist[i])
            {
                G->dist[i] = G->dist[minv] + G->edgeList[minv][i];
                G->path[i] = minv;
                p.dist = G->dist[i];
                p.vertex = i;
                minheap.push(p);
            }
        }
    }
    cout << endl;
}
int main()
{
    Graph G;
    BuildGraph(&G);
    Dijkstra(&G, 1);
    cout << "distance" << endl;
    for (int i = 1; i <= G.vertexnum; i++)
    {
        cout << G.dist[i] << " ";
    }
    cout << endl;
    cout << "path" << endl;
    for (int i = 1; i <= G.vertexnum; i++)
    {
        cout << G.path[i] << " ";
    }
    system("pause");
    return 0;
}
/*  
7 12
1 2 2
1 4 1
2 4 3
2 5 10
4 5 2
4 3 2
3 1 4
3 6 5
4 6 8
4 7 4
5 7 6
7 6 1
*/
目录
相关文章
|
1月前
|
算法
经典控制算法——PID算法原理分析及优化
这篇文章介绍了PID控制算法,这是一种广泛应用的控制策略,具有简单、鲁棒性强的特点。PID通过比例、积分和微分三个部分调整控制量,以减少系统误差。文章提到了在大学智能汽车竞赛中的应用,并详细解释了PID的基本原理和数学表达式。接着,讨论了数字PID的实现,包括位置式、增量式和步进式,以及它们各自的优缺点。最后,文章介绍了PID的优化方法,如积分饱和处理和微分项优化,以及串级PID在电机控制中的应用。整个内容旨在帮助读者理解PID控制的原理和实际运用。
87 1
|
8天前
|
算法
R语言使用随机技术差分进化算法优化的Nelson-Siegel-Svensson模型
R语言使用随机技术差分进化算法优化的Nelson-Siegel-Svensson模型
15 0
|
13天前
|
算法 测试技术 C#
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
|
14天前
|
算法 数据处理 C语言
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
|
16天前
|
算法 索引
【算法与数据结构】深入二叉树实现超详解(全源码优化)
【算法与数据结构】深入二叉树实现超详解(全源码优化)
|
16天前
|
存储 算法
【算法与数据结构】深入解析二叉树(二)之堆结构实现
【算法与数据结构】深入解析二叉树(二)之堆结构实现
|
27天前
|
存储 算法 搜索推荐
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
|
29天前
|
机器学习/深度学习 算法 大数据
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
29 3
|
1月前
|
算法 搜索推荐 测试技术
python排序算法及优化学习笔记1
python实现的简单的排序算法,以及算法优化,学习笔记1
33 1
|
1月前
|
算法 搜索推荐
基于遗传优化的协同过滤推荐算法matlab仿真
该内容是关于推荐系统和算法的描述。使用Matlab2022a执行的算法生成了推荐商品ID列表,显示了协同过滤在个性化推荐中的应用。用户兴趣模型通过获取用户信息并建立数学模型来提高推荐性能。程序片段展示了遗传算法(GA)的迭代过程,确定支持度阈值,并基于关联规则生成推荐商品ID。最终结果是推荐的商品ID列表,显示了算法的收敛和支持值。

热门文章

最新文章