(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)

简介: (万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)

(三) 搜索和图论



树与图的存储

树是一种特殊的图,与图的存储方式相同。

对于无向图中的边ab,存储两条有向边a->b, b->a。

因此我们可以只考虑有向图的存储。

(1) 邻接矩阵:g[a][b] 存储边a->b

(2) 邻接表:

// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点
int h[N], e[N], ne[N], idx;
// 添加一条边a->b
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
// 初始化
idx = 0;
memset(h, -1, sizeof h);

1.DFS


int dfs(int u)//模板
{
    st[u] = true; // st[u] 表示点u已经被遍历过
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j]) dfs(j);
    }
}


2.BFS


queue<int> q;//模板
st[1] = true; // 表示1号点已经被遍历过
q.push(1);
while (q.size())
{
    int t = q.front();
    q.pop();
    for (int i = h[t]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true; // 表示点j已经被遍历过
            q.push(j);
        }
    }
}


3.树与图的深度优先遍历


int dfs(int u)//模板
{
    st[u] = true; // st[u] 表示点u已经被遍历过
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j]) dfs(j);
    }
}


4.树与图的广度优先遍历


queue<int> q;//模板
st[1] = true; // 表示1号点已经被遍历过
q.push(1);
while (q.size())
{
    int t = q.front();
    q.pop();
    for (int i = h[t]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true; // 表示点j已经被遍历过
            q.push(j);
        }
    }
}


5.拓扑排序


bool topsort()
{
    int hh = 0, tt = -1;
    // d[i] 存储点i的入度
    for (int i = 1; i <= n; i ++ )
        if (!d[i])
            q[ ++ tt] = i;
    while (hh <= tt)
    {
        int t = q[hh ++ ];
        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (-- d[j] == 0)
                q[ ++ tt] = j;
        }
    }
    // 如果所有点都入队了,说明存在拓扑序列;否则不存在拓扑序列。
    return tt == n - 1;
}


6.Dijkstra


1.朴素版dijkstra
时间复杂是 O(n^2+m), n 表示点数,m 表示边数
int g[N][N];  // 存储每条边
int dist[N];  // 存储1号点到每个点的最短距离
bool st[N];   // 存储每个点的最短路是否已经确定
// 求1号点到n号点的最短路,如果不存在则返回-1
int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    for (int i = 0; i < n - 1; i ++ )
    {
        int t = -1;     // 在还未确定最短路的点中,寻找距离最小的点
        for (int j = 1; j <= n; j ++ )
            if (!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;
        // 用t更新其他点的距离
        for (int j = 1; j <= n; j ++ )
            dist[j] = min(dist[j], dist[t] + g[t][j]);
        st[t] = true;
    }
    if (dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}
2.堆优化版dijkstra
typedef pair<int, int> PII;
int n;      // 点的数量
int h[N], w[N], e[N], ne[N], idx;       // 邻接表存储所有边
int dist[N];        // 存储所有点到1号点的距离
bool st[N];     // 存储每个点的最短距离是否已确定
// 求1号点到n号点的最短距离,如果不存在,则返回-1
int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, 1});      // first存储距离,second存储节点编号
    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();
        int ver = t.second, distance = t.first;
        if (st[ver]) continue;
        st[ver] = true;
        for (int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > distance + w[i])
            {
                dist[j] = distance + w[i];
                heap.push({dist[j], j});
            }
        }
    }
    if (dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}


7.bellman-ford

8.spfa

9.Floyd

10.Prim

11.Kruskal

12.染色法判定二分图

13.匈牙利算法


(四)数学/数论知识



1.质数

2.约数

3.欧拉函数

4.快速幂

5.扩展欧几里得算法

6.中国剩余定理

7.高斯消元

8.求组合数

9.容斥定理

10.简单博弈论


(五)动态规划



1.背包问题

2.线性dp

3.区间dp

4.计数类dp

5.数位统计dp

6.状态压缩dp

7.树形dp

8.记忆化搜索


(六)简单版贪心



1.区间贪心类

2.Huffman树

3.排序不等式

4绝对值不等式

5.推公式


(七)C++的STL简介



1.vector, 变长数组,倍增的思想


   size()  返回元素个数

   empty()  返回是否为空

   clear()  清空

   front()/back()

   push_back()/pop_back()

   begin()/end()

   支持比较运算,按字典序


2.pair<int, int>


   first, 第一个元素

   second, 第二个元素

   支持比较运算,以first为第一关键字,以second为第二关键字(字典序)


3.string,字符串


   size()/length()  返回字符串长度

   empty()

   clear()

   substr(起始下标,(子串长度))  返回子串

   c_str()  返回字符串所在字符数组的起始地址


4.queue, 队列


   size()

   empty()

   push()  向队尾插入一个元素

   front()  返回队头元素

   back()  返回队尾元素

   pop()  弹出队头元素


5.priority_queue, 优先队列,默认是大根堆


   size()

   empty()

   push()  插入一个元素

   top()  返回堆顶元素

   pop()  弹出堆顶元素

   定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;


6.stack, 栈


   size()

   empty()

   push()  向栈顶插入一个元素

   top()  返回栈顶元素

   pop()  弹出栈顶元素


7.deque, 双端队列


   size()

   empty()

   clear()

   front()/back()

   push_back()/pop_back()

   push_front()/pop_front()

   begin()/end()


8.set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列


   size()

   empty()

   clear()

   begin()/end()

   ++, -- 返回前驱和后继,时间复杂度 O(logn)


 set/multiset


       insert()  插入一个数

       find()  查找一个数

       count()  返回某一个数的个数

      erase()

           (1) 输入是一个数x,删除所有x   O(k + logn)

           (2) 输入一个迭代器,删除这个迭代器

       lower_bound()/upper_bound()

           lower_bound(x)  返回大于等于x的最小的数的迭代器

           upper_bound(x)  返回大于x的最小的数的迭代器


 map/multimap


       insert()  插入的数是一个pair

       erase()  输入的参数是pair或者迭代器

       find()

       注意multimap不支持此操作。 时间复杂度是 O(logn)

       lower_bound()/upper_bound()


unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表

   和上面类似,增删改查的时间复杂度是 O(1)

   不支持 lower_bound()/upper_bound(), 迭代器的++,--


bitset, 圧位


   bitset<10000> s;

   ~, &, |, ^

   >>, <<

   ==, !=

   count()  返回有多少个1

   any()  判断是否至少有一个1

   none()  判断是否全为0


   set()  把所有位置成1

   set(k, v)  将第k位变成v

   reset()  把所有位变成0

   flip()  等价于~

   flip(k) 把第k位取反


相关文章
|
4天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
16 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
4天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
16 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
15天前
|
机器学习/深度学习 人工智能 算法
青否数字人声音克隆算法升级,16个超真实直播声音模型免费送!
青否数字人的声音克隆算法全面升级,能够完美克隆真人的音调、语速、情感和呼吸。提供16种超真实的直播声音模型,支持3大AI直播类型和6大核心AIGC技术,60秒快速开播,助力商家轻松赚钱。AI讲品、互动和售卖功能强大,支持多平台直播,确保每场直播话术不重复,智能互动和真实感十足。新手小白也能轻松上手,有效规避违规风险。
|
16天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
20天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
65 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 数据采集 算法
如何在一夜之间成为模型微调大师?——从零开始的深度学习修炼之旅,让你的算法功力飙升!
【10月更文挑战第5天】在机器学习领域,预训练模型具有强大的泛化能力,但直接使用可能效果不佳,尤其在特定任务上。此时,模型微调显得尤为重要。本文通过图像分类任务,详细介绍如何利用PyTorch对ResNet-50模型进行微调,包括环境搭建、数据预处理、模型加载与训练等步骤,并提供完整Python代码。通过调整超参数和采用早停策略等技巧,可进一步优化模型性能。适合初学者快速上手模型微调。
91 8
|
1月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
26 4
|
1月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
1月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
1月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)