算法
按自己的理解记的很多东西
许君。
庸俗清醒,懒人。
展开
-
最长上升子序列--LIS
最长上升子序列–LIS每次都向前找比它小的数和比它大的数的位置,将第一个比它大的替换掉,这样操作虽然LIS序列的具体数字可能会变,但是很明显LIS长度还是不变的//样例1 2 3 44 5 23 61 2 3 5 6vector实现(n^2)#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#include <vector>u原创 2021-08-14 17:23:16 · 92 阅读 · 0 评论 -
背包问题
背包问题01背包问题一件物品只有选or不选,是or不是两种情况/*f[i][j] 表示只看前i个物品,总体积是j的情况下,总价值最大是多少f[i][j] = 1.不选第i个物品 f[i][j] = f[i-1][j];2.选第i个物品,则总容量减少v[i] f[i][j] = f[i-1][j-v[i]]+w[i];f[0][0] = 0;*///二维const int N=1010;int n,m;int f[N][N];int v[N],w[N];int main(原创 2021-08-14 17:21:42 · 111 阅读 · 0 评论 -
生成树——Kruscal & Prim
生成树入门关于树MST——最小生成树无向无环的联通图任意两个结点之间有且仅有一条简单路径的无向图任何边均为桥的连通图没有圈,且在任意不同两点见添加一条边之后所得图含唯一的一个圈的图Kruscal适合简单图原理不断加边认定每个点都是一个独立的集合按照边的权值检查每一条边如果该边连接两个不同的集合,将边加入MST,合并两个集合集合的判定和合并使用并查集图解[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGEma39r-16289327原创 2021-08-14 17:19:52 · 129 阅读 · 0 评论 -
Floyd(弗洛伊德)算法
Floyd(弗洛伊德)算法演示图一演示图二实现//从1到n的最短路#include <bits/stdc++.h>using namespace std;const int maxn = 205, inf = INT_MAX / 2;int mp[maxn][maxn];int n;int main(){ cin>>n; //初始化 for (int i = 1; i <= n; i++)原创 2021-08-14 17:18:27 · 120 阅读 · 0 评论 -
Bellman-Ford(贝尔曼-福特) & SPFA算法
Bellman-Ford(贝尔曼-福特) & SPFA算法Bellman-Ford一种基于松弛(relax)操作——广度,的最短路算法。优点可以有负权边,但是不能出现负权环相对于迪杰特斯拉算法而言,它的时间复杂度更高,但是能解决负权边问题检测图中是否有负权值回路负权边:权重为负数的边。负权环:源点到源点的一个环,环上权重和为负数。判断是否存在负权环//解法:/*跑Bellman-Ford算法如果有点被松弛成功了n次,那一定存在如果n-1次之内算法就结束了,那一定不原创 2021-08-14 17:16:29 · 164 阅读 · 0 评论 -
Dijkstra(迪杰特斯拉)
Dijkstra(迪杰特斯拉)离散数学学过,不会就去跟着书上模拟一遍就完事儿(深度上进行操作)使用条件不能出现负权值路径用邻接矩阵实现#include <bits/stdc++.h>using namespace std;const int maxn=105,inf=1e9+7;int mp[maxn][maxn];//图的邻接矩阵int dis[maxn];//记录移动bool vis[maxn];//标记int n,m;//点、边void DJ(int s){原创 2021-08-14 17:15:19 · 163 阅读 · 0 评论 -
图论入门
图论入门图的建立与存储邻接表vector实现邻接表邻接表是面向边的数据结构,所以需要边的内容用一个结构体*存储*关于vector1、创建vector对象 vector<int> vec;2、插入 vec.insert();3、删除 vec.erase();4、尾部插入 vec.push_back();5、清空 vec.clear();vector建图struct Edge{ int from;//顶点序号 int to;//顶点序号 int w;原创 2021-08-14 17:14:24 · 381 阅读 · 0 评论 -
二分查找
二分查找条件:单调有序的集合元素(递增/递减),使用前可先排序时间复杂度O(logn)简单二分查找#include <bits/stdc++.h>using namespace std;int n,x;int ans=0;int a[15];void check(int l,int r,int m,int x){ int low=l,high=r,mid=m; while(1){ if(x<a[mid]) h原创 2021-08-14 17:12:06 · 113 阅读 · 0 评论