
数据结构与算法分析
Salmon_lee
这个作者很懒,什么都没留下…
展开
-
《算法笔记》SPFA算法
Bellman-Ford算法的优化,不用每次松弛所有边,只用松弛上次更新过的顶点的出边。需要记录顶点是否在队列中,如果可能存在负环,还需要记录入队次数。当更新某一结点时,判断它是否存在队列中,如果不在则将其入队。如果入队次数大于n-1次,则说明它被更新的次数大于n-1,说明存在负环。以下摘自《算法笔记》:...原创 2021-12-26 21:54:30 · 270 阅读 · 0 评论 -
最大公约数和最小公倍数
写在前面今天开始看《算法笔记》,从最简单的gcd算法开始。算法gcd(a, b) = gcd(b, a%b)gcd(a, 0) = alcm(a, b) = a / gcd(a, b) * b代码如下#include <iostream>using namespace std;int gcd(int a, int b){ return !b ? a : g...原创 2020-03-01 23:02:30 · 160 阅读 · 0 评论 -
子串判定算法(KMP&字符串哈希)
题目描述给定字符串haystack和needle,判定needle是否是haystack的子串。以下给出的两种算法复杂度均为O(m)。传送门:Leetcode 28KMP算法首先计算needle的next数组,随后执行KMP算法。class Solution{public: int strStr(string haystack, string needle) { if (needle.empty()) return 0;原创 2020-05-08 23:21:05 · 935 阅读 · 0 评论 -
Floyd判环算法
题目描述Leetcode 142:判断链表是否存在环,若存在环则返回链表开始入环的第一个节点,否则返回NULL。Floyd算法采用快慢双指针,慢指针每次移动一个结点,快指针每次移动两个结点。如图所示,假设头节点到入环结点的长度为n,环的长度为k,慢指针移动的步数为x,快指针移动的步数为2x。第一阶段:快慢指针在环中相遇(若有环它们必定相遇)此时有 (x - n) % k == ( 2x - n ) % k第二阶段:我们从头节点和快慢指针相遇的结点,都使用慢指针进行一步一步的移原创 2020-06-09 19:27:24 · 773 阅读 · 0 评论 -
树的最大连通分支问题
问题描述给定一棵树 T,树中每个顶点 u 都有一个权 w(u),权可以是负数。现在要找到树 T 的一个连通子图使该子图的权之和最大。对于给定的树 T,编程计算树 T 的最大连通分支。数据输入第一行有1个正整数n,表示树T有n个顶点,顶点的编号为1~n第二行有n个整数,表示顶点的权值接下来n-1行,每行有两个整数u、v,表示顶点u与v相连结果输出一个整数,表...原创 2019-04-18 23:32:43 · 5167 阅读 · 7 评论 -
希尔排序
图解排序算法(二)之希尔排序转载 2018-12-23 22:38:20 · 154 阅读 · 0 评论 -
AOV网络和AOE网络
AOV和AOE网络是什么活动网络可以用来描述生产计划、施工过程、生产流程、程序流程等工程中各子工程的安排问题。活动网络可分为两种:AOV网络和AOE网络AOV网络(Activity On Vertices):在有向图中,用顶点表示活动,用有向边u->v来表示活动u必须先于活动v进行AOE网络(Activity on edge network):若在带权的有向图中,以顶点表示阶段...原创 2018-12-02 22:41:29 · 4052 阅读 · 0 评论 -
全排列生成算法
一、手工实现(排列无顺序)原理:把第一位换掉,排列肯定是不同的...不好描述,直接上代码吧。#include <iostream>#include <algorithm>using namespace std;void print(int a[], int n) //输出某个序列 { for(int i = 0; i <= n; ++i) ...原创 2018-03-27 22:43:33 · 918 阅读 · 0 评论 -
【洛谷模板题】 线段树、树状数组入门(2)
题目:https://www.luogu.org/problemnew/show/P3372线段树(含区间修改)#include<iostream>using namespace std;#define LEFT(x) (x << 1)#define RIGHT(x) ((x << 1) | 1)long long seg[100005 * ...原创 2018-08-21 21:54:59 · 287 阅读 · 0 评论 -
【HDU1166 敌兵布阵】 线段树、树状数组入门(1)
数据结构介绍线段树(Segment Tree)树状数组,即二叉索引树(Binary Index Tree)典型例题HDU1166敌兵布阵这题只涉及到单点修改,关于区间修改:【洛谷模板题】 线段树、树状数组入门(2)线段树解法#include <iostream>using namespace std;#define LEFT(x) (x <&...原创 2018-08-21 00:12:37 · 253 阅读 · 0 评论