Acwing算法基础课——图论之堆优化的dijkstra算法

思路

首先请看懂我之前发的,dijkstra算法的朴素版本的讲解,既然是优化算法,那肯定是在某个算法的基础上进行优化的,如果基础版本都看不懂,那么直接看这个代码是毫无意义的。
我的朴素迪杰斯特拉讲解

#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
const int N=510;
int map[N][N];
int s[N];
int d[N];
int n,m;


int Dijkstra(){
   
   
    memset(d,0x3f,sizeof(d));
    d[1]=0;
  
    for(int i=0;i<n;i++){
   
   
        int t=-1;
        //找到当前未在(已找到最短距离的)集合中的距离1号点最近的点,肯定是需要遍历所有点才能找到的(这里可以用堆进行优化到logn)
        //所以这里会有一个for循环
        for(int j=1;j<=n;j++){
   
   
            if(!s[j]&&(t==-1||d[j]
### AcWing 算法基础课后的练习题目 为了巩固在AcWing算法基础课程中学到的知识,建议完成一系列有针对性的习题来提升技能。这些习题不仅能够帮助理解课堂上讲解的概念,还能提高解决实际问题的能力。 #### 推荐练习平台 推荐使用AcWing在线评测系统作为主要练习平台[^1]。该平台上提供了丰富的题目资源,并且支持多种编程语言提交代码,非常适合用来进行算法训练。 #### 基础数据结构算法部分 针对排序算法的学习效果检验可以尝试实现快速排序(Quick Sort),这有助于加深对分治思想的理解和掌握。具体来说,在规定时间范围内编写并成功调试通过快排程序是一个很好的实践方式。 ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` 对于图论中的最短路径求解方法,则可以从简单的Dijkstra算法入手。此算法适用于无负权边的情况下的单源最短路径计算问题。了解其基本原理之后,可以通过一些具体的实例来进行编码练习,从而更好地熟悉这一经典算法的应用场景[^2]。 ```cpp #include <iostream> #include <vector> #include <queue> using namespace std; const int N = 1e5 + 7; typedef pair<int, int> PII; int n, m, s; bool vis[N]; long long dis[N]; struct node { int to, cost; }; vector<node> G[N]; void dijkstra(int start){ fill(dis,dis+N,INT_MAX); priority_queue<PII,vector<PII>,greater<>> q; q.push(make_pair(start,0)); while(!q.empty()){ auto t=q.top(); q.pop(); int ver=t.first,dist=t.second; if(vis[ver]) continue; vis[ver]=true; for(auto i:G[ver]){ if(dist+i.cost<dis[i.to]){ dis[i.to]=dist+i.cost; q.push({i.to,dis[i.to]}); } } } } ``` 除了上述提到的基础知识点外,还应该注重其他方面能力的发展,比如控制流语句(顺序、选择、循环)、函数定义调用等基础知识也是不可或缺的一部分。因此,在日常刷题过程中应当注意全面覆盖各个领域内的核心概念和技术要点[^3]。 最后提醒一点关于区间操作类的问题也值得特别关注,例如区间合并就是一个典型例子。这类题目往往涉及到集合运算以及边界条件处理等内容,具有一定的挑战性和趣味性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值