算法学习
本专题为算法与数据结构学习 过程中的 笔记 与代码实现
相关代码可在github进行fork
https://github.com/gaowanlu/Algorithm
高万禄
一个菜鸡
展开
-
旅游路线问题 线性规划网络流
旅游路线问题#include <iostream>在这里插入图片描述#include <cstring>#include <map>#include <queue>using namespace std;using std::cout;const int INF = 1000000; //正无穷const int NODESIZE = 100; //结点最大个数const int EDGESIZE = 10000; //最大边数原创 2022-05-05 00:21:31 · 516 阅读 · 0 评论 -
方格取数问题 线性规划网络流
方格取数问题有一网格,每个格子有一定价值的物品,拿了某个格子的物品,则不能拿去其上下左右的物品怎样使得价值最大将问题抽象为黑白格 取黑则不能取上下左右的格子(白色) 白色则相反构建网络源点 黑色方格 白色方格 汇点源点–>黑色方格 容量:黑色方格价值白色方格–>汇点 容量:白色方格价值黑色方格–>白色方格 :两方格相邻,且容量为正无穷切割线 :切中的边容量为没有选中的方格权值则使其最小,达到了选中方格总权值最大#include<iostream>#inc原创 2022-05-05 00:18:54 · 693 阅读 · 0 评论 -
最大收益问题 线性规划网络流
最大收益问题一批实验 E={E1,E2…} 需要仪器集合 I={I1,I2,I3…}进行Ei可盈利 pi 购入仪器Ii要花费ci进行实验可盈利一定金额 没买一种仪器也要花费一定金额怎样选实验 使得盈利最大?实验净收益=选中实验项目收益 - 选中的仪器费用选中实验项目收益=全部项目收益 - 未选中的项目收益实验净收益= 全部项目收益 - (未选中的项目收益+选中的仪器费用)切割线将图分为两部分 S T, S :选中的实验项目与仪器 T:未选中的实验项目与仪器未选中的项目收益+选中的仪器费用原创 2022-05-05 00:16:24 · 428 阅读 · 0 评论 -
动态规划之最优搜索二叉树(2021/3/13)
动态规划之最优二叉树问题引入代码实现/*算法:最优搜索二叉树(动态规划法)编码人员:高万禄日期:2021/3/13*/#include<iostream>#include<cstdlib>#include<cmath>//输入Nint scanfN(void){ int temp; std::cin>>temp; if(temp>0){ return temp; }else{原创 2022-04-10 08:36:31 · 758 阅读 · 0 评论 -
三数之和 leetcode
我也是个菜鸡,当看到这个题时,想到肯定是枚举,但怎么取出重复的呢,这是个大问题。看来是不能简单穷举的。像这种题一般将其排序可能会更好求解些,因为就可以根据求和大小略过某些元素然后看了看评论区,恍然大悟,有这种操作。首先我们的问题出在了,怎么取出重复情况,那么研究一下什么时候出现重复请情况(a,b,c) (d,e,f) 两三元组内至少有两个元素相同时,两个三元组一定是相同的。则我们以一个例子来展开讨论-1 0 1 2 -1 4 2排序-1 -1 0 1 2 2 4 i b .原创 2021-10-15 01:23:13 · 166 阅读 · 0 评论 -
试题库问题(最大流Isap) 网络流
试题库问题(最大流Isap) 网络流简介图片来源 《趣学算法》人民邮电出版社 陈小玉算法设计图片来源 《趣学算法》人民邮电出版社 陈小玉代码实现#include<iostream>#include<cstring>#include<queue>#include<algorithm>using namespace std;const int INF=0x3fffffff;const int N=100;const int M=100原创 2021-10-06 09:07:16 · 202 阅读 · 0 评论 -
圆桌问题 网络流Isap算法
#include<iostream>#include<cstring>#include<queue>#include<algorithm>using namespace std;const int INF=0x3fffffff;const int N=100;const int M=10000;int top;int h[N],pre[N],g[N];struct Vertex{ int first;}V[N];struct原创 2021-10-05 00:24:54 · 253 阅读 · 0 评论 -
配对方案问题匈牙利算法
#include<iostream>#include<cstring>using namespace std;const int INF=0x3fffffff;const int N=100;const int M=10000;int match[N];bool vis[N];int top;struct Vertex{ int first;}V[N];struct Edge{ int v,next;}E[M];void init(){ me原创 2021-10-05 00:23:53 · 177 阅读 · 0 评论 -
最短增广路Isap算法 网络流
/*最短可增广路:重贴标签算法Isap算法设计:1、确定合适数据结构,采用邻接表存储网络。2、对网络结点贴标签,即标高操作。3、对源点的高度>=结点数,则转向第(6)步,否则从源点开始,沿着高度h(u)=h(v)+1且有可行邻接边(cap>flow)的方向前进,如果到达汇点,则转向第(4)步;如果无法行进,则转向第(5)步。4、增流操作:沿着找到的可增广路同向边增流,反向边剑流。注意:在原网络上操作。5、重贴标签:如果拥有当前结点高度的结点只有一个,则转向第(6)步;令当前结点的原创 2021-10-05 00:21:37 · 462 阅读 · 0 评论 -
配对方案Isap算法 网络流
简略介绍二分图:又称作二部图,设G=(V,E)是一个无向图,如果结点集V可分割为两个互不相交的子集(V1,V2),并且图中的每条边(i,j)所关联的两个结点i和j分别属于这两个不同的结点集(i<-V1,j<-V2)匹配:在图论中,一个匹配是一个边的集合,其中任意两条边都没有公共结点。最大匹配:一个图所有匹配中,边数最多的匹配,称为这个图的最大匹配。V1 V2 边 1–61 5 1–72–52 6 3原创 2021-09-27 21:02:36 · 432 阅读 · 0 评论 -
最小费用最大流算法 网络流
最小费用最大流算法代码实现/*参考:《趣学算法》陈小玉 人民邮电出版社最小费用最大流---最小费用路算法问题分析: 在实际应用中,要同时考虑流量和费用,每条边除了给定容量之外, 还定义了一个单位流量的费用. 网络流的费用=每条边的流量*单位流量费用 我们希望费用最小,流量最大,因此要求解最小费用最大流 容量 流量 单位流量费用 (cap,flow,cost) v1--------------------->v2 混原创 2021-06-06 16:19:55 · 1899 阅读 · 0 评论 -
线性规划网络流之最短增广路算法
线性规划网络流之最短增广路算法代码实现/*最短增广路C++实现参考资料:《趣学算法》陈小玉 人民邮电出版社*/#include<iostream>#include<queue>#include<cstring>using namespace std;const int MAXNODESIZE=100;//网络最大节点数const int INF=(1<<30)-1;int residualNetwork[MAXNODESIZE][MAX原创 2021-06-04 23:49:08 · 406 阅读 · 0 评论 -
线性规划标准型转化及单纯性算法之线性规划网络流(工厂最大收益)
线性规划问题(1) 确定决策变量(2) 确定目标函数(3) 找出约束条件(4) 求最优解简单问题例:图片来源:《趣学算法》陈小玉-人民邮电出版社 变量满足约束条件的一组值称为线性规划的一个可行解 所有可行解构成集合称为线性规划问题的可行区域 使得目标函数取得极值得可行解称为最优解 在最优解处目标函数的值称为最优值线性规划问题解的情况有唯一最优解 有无数个最优解 没有最优解线性规划标准型线性规划标准型转化方法单纯性算法基本变量:每个约束条件中的系数为正且原创 2021-06-03 18:05:01 · 1099 阅读 · 0 评论 -
最优工程布线问题之分支界限法(bfs)
最优工程布线问题之分支界限法(bfs)/*分支界限-最优工程布线-bfs * * a _ * a-* 可知走四步可以从a到b * _ _ _ | | 上 下 左 右 * _ _ b *-*-* ---- ---- ---- ---- * | | | ---- 。。。。。。。。。。。。 * *-*原创 2021-06-01 15:26:26 · 552 阅读 · 0 评论 -
旅行商问题之分支界限法(bfs)
旅行商问题之分支界限法(bfs)#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>using namespace std;const int INF=1e7;//正无穷const int N=100;//最大地点容量double graph[N][N];//地点邻接矩阵int bestRoad[N];//最优路径原创 2021-06-01 15:24:31 · 1058 阅读 · 0 评论 -
0-1背包问题之分支界限法
0-1背包问题之分支界限法代码实现#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>using namespace std;const int N=100;//物品最大数量bool bestChoose[N];//辅助空间记录最优解//定义结点数据结构struct Node{ int cp,rp;/原创 2021-05-09 12:38:29 · 453 阅读 · 0 评论 -
回溯法解八皇后
任务描述本关任务:假设已放了8个皇后的棋盘(在每列、每行上只有一个皇后,且一条斜线上也只有一个皇后)。用回溯法解8个皇后问题的全部解。编程要求定义函数Try(i),用来试探放第i行上的皇后。讨论将第i行上的皇后放在j列位置上的安全性,可以逐行地放每一个皇后,在做这一步时,第i行上还没有皇后,不会在行上遭到其他皇后的攻击。只考虑来自列和对角线的攻击。定义q(i)=j表示第i行上的皇后放在第j列,一旦这样做了,就要考虑第i个皇后所在的列不安全了,让C[j]=false,同时,要考虑通过(i,j)位置的两原创 2021-04-26 11:17:32 · 784 阅读 · 0 评论 -
动态规划算法0-1背包求最大价值数组
任务描述本关任务:给定N个物品和一个背包,背包的容量为W, 假设背包容量范围在[0,15],第i个物品对应的体积和价值分别为W[i]和v[i]。各种物品的价值和重量如下:物品编号 1 2 3 4 5重量W 3 4 7 8 9价值V 4 5 10 11 13求: 如何选择装入背包的物品,使得装入背包的物品的总价值为最大。相关知识为了完成本关任务,你需要掌握:1.动态规划原理的方法;2.0/1背包问题。编程要求按动态规划原理求0/1背原创 2021-04-26 11:06:27 · 974 阅读 · 0 评论 -
旅行商问题之回溯法
旅行商问题之回溯法代码实现//回溯法 旅行商问题#include<iostream>#include<cstdlib>#include<algorithm>using namespace std;const int INF=1e7;//正无穷int n;//节点个数int m;//边的个数int**matrix;//邻接矩阵int*x;//当前路径int*bestx;//最优路径int cl;//当前路径长度int bestl;//最优路径长度原创 2021-04-12 21:07:24 · 582 阅读 · 0 评论 -
最优加工顺序之回溯法
最优加工顺序之回溯法代码实现/*第一台机器可以连续加工,第二台机器工作的开始时间为第一台机器结束与第二台机器结束的最大值 * */#include<iostream>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;#define MAX 9999int n;//存储机器零件的个数int T1[MAX];int T2[MAX];int tempChoose[MAX];int bes原创 2021-04-12 21:05:09 · 725 阅读 · 0 评论 -
n皇后问题之回溯法(2021/3/26)
n皇后问题#include<iostream>#include<cmath>using namespace std;int resultCount=0;//记录解的个数int n=0;//皇后个数int result[1000]={0};bool Place(int t){ bool re=true; //判断与前面的t-1个皇后位置是否冲突 for(int i=0;i<t;i++){ if(result[t]==resul原创 2021-03-26 23:59:23 · 245 阅读 · 0 评论 -
最大团问题之回溯法(2021/3/17)
回溯法之最大团问题源代码/*算法:最大团问题日期:2021/3/17编码:高万禄*/#include<iostream>#include<cstdlib>using namespace std;//申请大小为n*n得二维数组,并将值初始化为0int** getM(int n){ int **M=(int**)malloc(sizeof(int*)*(n)); for(int i=0;i<n;i++){ M[i]=(int*原创 2021-03-17 13:53:54 · 566 阅读 · 0 评论 -
01背包问题之回溯法(2021/3/15)
回溯法之01背包问题源代码/*名称:01背包回溯法求解编码:高万禄日期:2021/3/15 */ #include<iostream>#include<cstdlib>/*测试样例 存储物品个数4购物车容量 10依次输入物品重量W[] 2 5 4 2依次输入物品价值V[] 6 3 5 4W[]--V[]: 2--6 5--3 4--5 2--4选中的物品序号为: 0 2原创 2021-03-15 07:20:59 · 392 阅读 · 0 评论 -
最优二叉搜索树之动态规划(2021/3/13)
动态规划之最优二叉搜索树问题引入代码实现/*算法:最优搜索二叉树(动态规划法)编码人员:高万禄日期:2021/3/13*/#include<iostream>#include<cstdlib>#include<cmath>//输入Nint scanfN(void){ int temp; std::cin>>temp; if(temp>0){ return temp; }els原创 2021-03-13 11:41:11 · 692 阅读 · 0 评论 -
动态规划之01背包问题(2021/3/4)
动态规划之01背包问题递归式代码实现#include<iostream>using namespace std;#define SIZE 5//有SIZE个物品#define LoadingCapacity 10 //装载能力 int Weight[SIZE+1]={0,2,5,4,2,3};//重量 2,5,4,2,3int Value[SIZE+1]={0,6,3,5,4,6};//相应物品的价值 6,3,5,4,6int C[SIZE+1][LoadingCapacit原创 2021-03-04 19:38:58 · 269 阅读 · 1 评论 -
动态规划之石子合并(2021/2/4)
问题引入代码实现#include<iostream>using namespace std;#define N 1000#define INF 99999//无穷 int stones[N];//存储每堆石子数量 int Min[N][N],Max[N][N];int sum[N];//计算1 - i堆的石子和 //公路玩法 void highway(int n){ //初始化Min Max矩阵 for(int i=1;i<=n;i++){ Min[i][i]原创 2021-02-04 23:33:46 · 378 阅读 · 0 评论 -
动态规划之最优三角分割(2021/2/3)
问题引入代码实现#include<iostream>using namespace std;#define N 1000int map[N][N];//图的邻接矩阵int strategy[N][N];//记录i j 中间的最优割点int m[N][N];//记录i j之间切割的最优权重 //三角切割 void convex_triangular_cutting(int n){ //初始化最优权重与策略矩阵 for(int i=0;i<n;i++){ stra原创 2021-02-04 21:20:42 · 401 阅读 · 1 评论 -
动态规划之矩阵连乘(2021/2/2)
问题引入代码实现//问题:矩阵连乘//日期:2021/2/1//编码:高万禄#include<iostream>using namespace std;#define N 1000//最多N-1个矩阵int matrix_data[N];int mul_num[N][N],strategy[N][N];//发现策略信息void matrix_mul(int&matrix_num){ //置空信息矩阵 for(int i=0;i<N;i++){ for原创 2021-02-02 22:57:40 · 263 阅读 · 0 评论 -
动态规划之游艇租赁(2021/2/1)
问题引入游艇租赁规则游艇租赁价格表代码实现#include<iostream>#include<cstdlib>using namespace std;#define N 1000int price_map[N][N];//价格表int real_price[N][N];//最优价格int strategy[N][N];//策略选择//打印解决方案 void print(int i,int j){ if(strategy[i][j]==0){ cou原创 2021-02-01 15:04:04 · 288 阅读 · 0 评论 -
动态规划之编辑距离(2021/1/29)
程序输出样例s1: familys2: frames1: familys2: frame编辑距离: 4d[][]:0 1 2 3 4 51 0 1 2 3 42 1 1 1 2 33 2 2 2 1 24 3 3 3 2 25 4 4 4 3 36 5 5 5 4 4--------------------------------Process exited after 10.78 seconds with return val原创 2021-01-29 20:29:24 · 295 阅读 · 0 评论 -
动态规划之最长公共子序列(2021/1/28)
动态规划之最长公共子序列问题引入手写解析代码实现(C/C++)/*动态规划算法:最长的公共子序列 日期:2021/1/28 编码:高万禄 */#include<iostream>#include<vector>#include<cstdlib>using namespace std;//求解最长公共子序列函数 void LCSL(string&s1,string&s2,int**c,int**b){ //求解c原创 2021-01-28 21:57:27 · 314 阅读 · 0 评论 -
分治法之大整数乘法(2021/1/26)
问题引入代码实现//大整数乘法 #include<cstdlib>#include<cstdlib>#include<cstring>#include<iostream>using namespace std;const int M =1000;//存放两个要乘的大数 char A[M];char B[M];struct Node{ char num[M]; int l;//记录长度 int c;//记录次幂 };//原创 2021-01-26 15:55:35 · 383 阅读 · 0 评论 -
分治法之快速排序(以及快速排序的优化)(2021/1/24)
问题引入快速排序以及其优化代码实现#include<iostream>#include<cstdlib>using namespace std;struct Data{ int flag;};//快速排序划分函数,返回基准元素最后的下标 int Partition(struct Data*list,int low,int high){ struct Data temp; int i=low,j=high,p=low; while(i<j){ //原创 2021-01-24 19:04:50 · 356 阅读 · 0 评论 -
分治法之合并排序(2021/1/23)
问题引入代码实现#include<iostream>#include<cstdlib>using namespace std;struct Data{ int flag;};void MergeFunction(struct Data*list,int low,int middle,int high){ //申请辅助空间 int size=high-low; struct Data*space=(struct Data*)malloc(sizeof(struc原创 2021-01-23 09:39:01 · 287 阅读 · 0 评论 -
分治法之二分查找(递归与非递归)(2021/1/22)
问题引入分治法三原则原问题可以分解为若干个规模比较小的相同子问题子问题互相独立子问题的解可以合并为原问题的解分治法基本解题流程分解->治理->合并二分查找算法(折半查找)故事代码实现#include<iostream>#include<algorithm>using namespace std;//抽象数据struct Data{ int flag;};//sort排序Data数组的比较函数bool compare(stru原创 2021-01-22 12:51:40 · 509 阅读 · 0 评论 -
贪心算法之Prim最小生成树(2021/1/21)
问题引入Prim生成最小树算法(邻接矩阵存储图)代码实现/*Create by Wanlu Gao* 2021/1/21 * 实现功能:* 在此程序中实现的为邻接矩阵存储图Prim最小生成树*/#include<iostream>#include<cstdlib>using namespace std;//定义无穷const int INF=9999; //存储图的顶点数 const int map_dot_num=7;//初始化邻接矩阵const i原创 2021-01-21 15:43:22 · 294 阅读 · 0 评论 -
贪心算法之哈夫曼树及其编码(2021/1/20)
问题引入哈夫曼树构建及其编码输出代码实现//哈夫曼树及其编码 #include<iostream>#include<cstdlib>#include<vector>using namespace std;//定义节点抽象数据结构struct HuffNode{ float weight;//节点权重 int parent;//节点的父节点下标 int lchild;//节点的左孩子下标 int rchild;//节点的右孩子下标 cha原创 2021-01-20 14:20:36 · 622 阅读 · 0 评论 -
贪心算法之迪科斯彻单源最短路径(2021/1/19)
问题引入迪科斯彻单源最短路径代码实现//迪科斯彻最短路径算法(单源最短路径)#include<iostream>using namespace std;//顶点个数const int CITY = 5;//定义无穷const int INF = 1000;//使用二维数组存储邻接矩阵//在此我们直接在源代码中添加邻接矩阵信息//为了是弄懂程序流程而非实际问题int map[CITY][CITY]={{INF,2,5,INF,INF},{INF,INF,2,6,INF原创 2021-01-19 13:22:20 · 274 阅读 · 0 评论 -
贪心算法之会议安排(2021/1/18)
问题引入代码实现//会议时间表//会议 1 2 3 4 5 6 7 8 9 10//开始时间 8 9 10 11 13 14 15 17 18 26 //结束时间 10 11 15 14 16 17 17 18 20 19//贪心策略:局部最优解,选择结束最早的//相容且最早结束#include<iostream>using namespace std;struct Meeti原创 2021-01-18 10:54:47 · 485 阅读 · 0 评论 -
贪心算法之背包问题(2021/1/17)
趣味故事问题:假设山洞有n种宝物,每种宝物有一定重量w和相应价值v毛驴运载能力有限,只能运走m重量的宝物,一种宝物只能拿走一样,宝物可以分割,怎样才能使毛驴运走宝物的价值最大呢?代码实现:#include<iostream>using namespace std;//第一眼看背包问题怎么和最优装载问题有些相似呢//它们都可以利用贪心策略来求解 //局部最优://选择性价比最大的宝物 int main(int argc,char**argv){ int i=0,j=0原创 2021-01-17 10:50:59 · 392 阅读 · 0 评论