- 博客(21)
- 收藏
- 关注
原创 Dijkstra法解单源最短路径问题(附手写堆代码)
Dijkstra法解单源最短路径问题(附手写堆代码)原题来自洛谷【模板】单源最短路径(标准版)题目描述给定一个 nnn 个点,mmm 条有向边的带非负权图,请你计算从 sss 出发,到每个点的距离。数据保证你能从 sss 出发到任意点。输入格式第一行为三个正整数 n,m,sn,m,sn,m,s 。 第二行起 mmm 行,每行三个非负整数 ui,vi,wi, 表示从 ui到 vi 有一条权值为 wi 的有向边。输出格式输出一行 nnn 个空格分隔的非负整数,表示 sss 到每个点的最短距离。
2020-11-30 19:09:09
474
原创 Graham算法解决凸包问题
Graham算法解决凸包问题模板题,题目来自洛谷如下。圈奶牛【模板】二维凸包 题目简要描述给定一些点,求凸包的周长。输入格式输入数据的第一行是一个整数。表示农夫约翰想要围住的放牧点的数目n。第 $ 2 $ 到第 (n+1)(n + 1)(n+1) 行,每行两个实数,第 (i+1)(i + 1)(i+1) 行的实数 $ xi, yi $分别代表第 iii 个放牧点的横纵坐标输出格式输出输出一行一个四舍五入保留两位小数的实数,代表围栏的长度。输入输出样例//输入44 84 125
2020-11-29 15:29:22
269
原创 Dinic算法解最大流问题
Dinic算法解最大流问题具体的最大流的定义及原理可以参见这位朋友的博客(简单易懂)最大流问题详解(侵删)Dinic算法的基本原理利用BFS对图进行分层处理,接着使用DFS从S开始,每次层次加一寻找下一个点,直至达到汇点T,然后再回溯回去,以此遍历所有的增广路径,这样就可以满足我们同时求出多条增广路的需求,效率更高因此可给出Dinic算法的进行框架①在残量网络上通过BFS求出结点的层次,构造分成图。②在分层图上通过DFS寻找增广路,在回溯时同时更新边权。更加具体的原理可以参见这位朋友的博客
2020-11-27 09:46:11
353
原创 拓扑排序
题目描述在大学里面,很多课程的内容是有联系的,你只有先学习了某一门课程,才能够更好地理解另一门课程。比如,想要学好算法,你首先得学习高级语言程序设计、数据结构等课程。我们将这些课程称为它的前置课程。现在假设你是某大学某个系的教务主任,该系的学生需要修满n门课程才能达到毕业要求,已知课程之间的前置关系,请你为该系的学生排课。输入第一个数为课程数n,课程之间的前置关系数m,课程的编号为0~n-1接下来m行,每行2个整数u、v,表示u号课程是v号课程的前置课程。输出n个整数,用空格隔开,表示排
2020-11-22 16:59:08
256
原创 动态规划解矩阵链乘法
题目描述用加括号的方式给出最优的矩阵相乘方案输入第一行一个整数 n,表示矩阵链的长度(1<=n<=300)接下来一行n+1个数表示这些矩阵的行数和列数n+1个数中,每相邻的两个数表示一个矩阵的大小输出对于每组数据,输出两行,第一行为计算次数,第二行为计算方案,用加括号的方式给出最优的矩阵相乘方案如果不幸最优方案不唯一,选择优先计算左边的矩阵输入样例310 20 5 4输出样例1200((A1A2)A3)代码实现# include <bits/stdc++
2020-10-28 14:43:18
252
原创 动态规划解钢条切割问题
题目描述给一条钢管,切割成不同长度的钢管(也可以不切割),不同的钢管长度对应不同的价值,求这根钢管获得的最大价值。输入第一行包含一个正整数L,为钢管的长度。第二行包含L个正整数a1…aL,为长度从1到L的钢管对应的价值。输出输出一行,为钢管能获得的最大价值。输入样例51 10 14 8 16输出样例24思考后直接想到采用自底向上的动态规划法,即从2到n(n为钢管长度)存入每一个长度的钢管的最优价值,并逐步往上(利用之前已存的数据)下面给出完整代码# include <bi
2020-10-28 10:28:33
504
原创 快速排序
基本思想快排的基本思想是分治,将数组A[p…r]划分为两个(可能为空)子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中的每个元素都小于等于A[q],而A[q]也小于等于A[q+1…r]中的每个元素,其中,计算下标q也是划分过程的一部分。大体过程通过上述的基本思想,写出大体代码如下void quicksort(int A[], int p, int r){ if(p >= r) return; else{ q = partition
2020-10-15 23:42:07
68
原创 堆排序
堆排序堆的介绍堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个结点对应数组中的一个元素。同时,除了最底层外,该树是完全充满的,而且是从左向右填充最大堆与最小堆二叉堆分为两种,即最大堆与最小堆。在最大堆中,最大堆性质是指除了根以外的所有结点i都要满足:A[PARENT(i)] >= A[i],即除根结点外的每个结点都大于或等于其子结点,下图则为一个最大堆。(图源自《算法导论》)而最小堆则与之相反。最大堆的维护维护最大堆,即判断某个结点是否符合最大堆的性质,如若不符合,通过将其与
2020-10-15 18:24:57
977
原创 求最大子数组问题
问题描述假定你获得了投资挥发性化学公司的机会。与其他公司一样,该公司的股票价格是不稳定的。你被准许可以在某个时刻买进一股该公司的股票,并在之后的某个时期将其卖出。你可以了解股票将来的价格,使得自己的利益最大化。你的任务是根据每天的股票价格,求得最大的收益。输入一个整数n,表示天数接下来一行,n个整数,用空格隔开,表示每天的股价。输出一个整数,表示最大收益。问题分析这类问题就是典型的最大子数组问题,可以通过将后一天的股票值减去前一天的股票值,即可得到这两天买入售出所盈利(亏损)的值。接着
2020-10-11 11:52:26
144
原创 二分法解数组分段和最大值最小问题
问题描述给定一个数组,和一个值k,数组分成k段。要求这k段子段和最大值最小。求出这个值。问题分析这里采用二分的思想来解决问题。首先求出数组中的最大值max与数组所有值的和sum,则所求值必在max与sum之间(可以自己推理),接下来利用二分思想,将max与sum命为l与r,并不断测试中值,不断二分,最后得到所求值具体代码#include<bits/stdc++.h>#include<stdio.h> #define maxn 1005000using names
2020-10-10 08:18:56
1364
原创 归并之求逆序对个数
题目描述给定一个整数序列,求逆序对的个数主要思路将整个序列分为左右两边的序列,左右两序列都已按从小到大的顺序排列,此时逆序对的个数即加上左侧序列大于右侧序列的逆序对数。如左侧为(2,4,6),右侧为(1,3,5),通过循环发现 2>1,则易得后面的4,6均可与1形成逆序对(因为是按升序排列),基于此可写出代码代码呈现#include<bits/stdc++.h> //万能头文件using namespace std;#define N 1005000;int a[N]
2020-09-24 18:27:23
272
原创 最小生成树问题之Kruskal算法
这里最小生成树的定义不再赘述,直接给出Kruskal算法的思路与代码。Kruskal算法的思路首先对于一幅图,设G=(V,GE)为具有n个顶点的带权连通图。T=(U,TE)为生成的最小生成树,初始时,T中包含G中所有顶点,但不包含边。从G中选择一条当前未选择过的、且边上权值最小的边加入TE中,若加入TE后使得T未产生回路,则本次选择有效,若使得T中产生回路,则本次选择无效,放弃选择这条边。重复上述选择过程,直到TE包含了G的n-1条边,此时T为G的最小生成树。代码实现过程Kruskal算法的实现主
2020-05-26 16:22:01
515
原创 最小生成树问题之Prim算法
这里最小生成树的定义不再赘述,直接给出Prim算法的思路与代码。Prim算法的思路首先对于一幅图,设G=(V,GE)为具有n个顶点的带权连通图。T=(U,TE)为生成的最小生成树,初始时,T中为空。首先,在图中选择一个顶点进入T中。接着再从G中选择一条一个顶点仅在V中,另一个顶点在U中,并且权值最小的边加入集合TE,同时将该边仅在V中的那个顶点加入集合U。通俗来讲,就是在不在生成树中的顶点中选择一个顶点,使其到生成树中某个顶点的权值为最小。然后重复经历此过程直到所有顶点都被选取完,此时的T即为G的最小
2020-05-24 22:56:30
457
原创 通过顺序储存和链式储存构造二叉排序树
二叉排序树的定义不再叙述,主要介绍方法与代码。这里要求构造二叉排序树后输入其中序遍历(可得到从小到大的排列)核心算法:用递归或循环使小于结点的往左边放置先介绍通过顺序储存的方法代码如下:#include<stdio.h>#include<string.h>#define maxn 1005000int d[maxn];//存所有数据int dl[maxn]...
2020-02-25 20:04:08
1069
原创 将中缀表达式转化成后缀表达式来计算值
题目很简单,就是给出一个表达式(例如2*(3+5)+6),然后我们得出他的值。未接触这个方法前,我是用了一种很复杂的方法(爆肝警告)将中缀表达式(就是我们要求的表达式)转化成后缀表达式来解决就会比较简单。对于中缀表达式和后缀表达式的概念这里就不说了,只将方法呈现出来。例如一个中缀表达式:A+(B-C/D)✖E,是如何将其转化成后缀表达式:ABCD/-E✖+的?(忽略乘号的特殊)直接介绍...
2020-02-22 15:58:51
374
1
原创 二叉树遍历问题
直奔主题这里是原题 二叉树遍历概括一下就是 给出了一个二叉树的前序遍历和中序遍历所得到的字符 我们则要输出这个二叉树的后序遍历首先我们要根据给出的前序遍历和中序遍历构造出这个二叉树,接下来再用一个读出后序遍历的函数即可。首先,构造二叉树用到递归的方法例如数据 :ABCDEFG;DCBAEFG根据前序遍历和中序遍历的特点,A肯定为根结点,接着在中序遍历中找到A,中序遍历中A左边的即为...
2020-02-13 15:17:05
243
原创 最小堆的建立及堆排序
堆的建立堆在很多方面都有运用,这里写一下将一个完全二叉树用一维数组保存后再转化为一个最小堆代码如下(假如树中的数据都为整数)#include<stdio.h>int a[50];int n;void swap(int p,int q){//交换函数 int tmp; tmp=a[p]; a[p]=a[q]; a[q]=tmp;}void siftdown(int...
2020-02-02 17:51:29
940
原创 搜索之图的深度优先遍历
题目是书本《啊哈!算法》中的例题,稍加改变的题目如下。暑假小哼想到小哈家里去玩,小哼和小哈住在不同的城市,并且小哼之前从来没有去过小哈家,这是小哼第一次上门。怎么去呢?小哼便想起了百度地图。百度地图一下子就给出了从小哼家到小哈家的最短行车方案。爱思考的小哼想知道百度地图是如何计算出最短行车方案的。下面就是代码所表示城市的地图。接下来给出输入样例输入5 8 1 51 2 21 5 ...
2020-01-31 23:31:31
297
原创 搜索之走迷宫
用dfs和bfs解决迷宫问题小明走迷宫输入输入多组测试数据。对于每组数据,第一行是两个个数字m和n,表示该阵为mn大小(0<m,n<=10,m为行,n为列)。接下来是一个mn的矩阵表示这个阵。其中0为该阵中可走的路,1为墙(不可走),2为小明的位置,3为出口的位置。小明只有四个可行的行走方向:即上、下、左、右。输出如果小明可以逃离,输出Yes,反之输出No一、...
2020-01-29 01:09:52
362
原创 关于C语言的以文件输入输出的方式
关于C语言的以文件输入输出的方式为什么要将数据以文件的形式来输入或者输出呢?有些是题目要求,而有些可以是方便我们操作(有时测试数据太多,不断地复制粘贴也麻烦)这里简单介绍两种方法一:重定向#include<stdio.h>#include<string.h>int main(){ freopen("in.txt","r",stdin); freopen(...
2020-01-10 11:59:56
1574
原创 利用c语言递归计算n阶行列式 并利用行列式求矩阵的伴随矩阵与逆矩阵
利用c语言递归计算n阶行列式问题:输入一个数字n,再输入一个n阶行列式,且每一项都是整数,得到行列式的值首先,计算行列式的值,先想到利用行列式的展开原理使它的阶次慢慢减少,从而很容易想到使用递归,那么如何用递归实现?话不多说,直接上代码(这里设只算10阶)小白在学长帮助下所写,欢迎大佬给出指导性意见#include<stdio.h>#include<math.h>...
2019-11-16 12:18:30
3129
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人