
算法介绍
imyyy_
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。
展开
-
强连通分量 Kosaraju科萨拉朱算法
#. 图G:图的所有正向边#. 图rG:图的所有反向边1. 在G上dfs,标记访问点的先后顺序,,,,递归最底层的点标记最小2.在rG上dfs,顺序从最大的点到最小的点#include<iostream>#include<vector>using namesapce std;const int NUM = 1e5+5;vector<int> G[NUM],rG[NUM];int vis[NUM], scnno[NUM];vector<int&原创 2021-09-19 18:49:15 · 415 阅读 · 0 评论 -
前缀和,(一维,二维)
Leetcode 303class NumArray {public: vector<int> ans; //前缀和数组 NumArray(vector<int>& nums) { int n=nums.size(); ans.resize(n+1); for(int i=0;i<n;i++){ ans[i+1]=ans[i]+nums[i]; }原创 2021-03-02 13:26:20 · 224 阅读 · 0 评论 -
拓扑排序
代码用邻接表存储bool TopologicalSort(Graph G) { InitStack(S); for (int i = 0; i < G.vexnum; i++) { if (indegree[i] == 0) Push(S, i); } int count = 0; while (!isEmpty(S)) { Pop(S, i); print[count++] = i; for (p = G.Vertices[i].firstarc; p; p = p-原创 2021-02-14 20:11:32 · 242 阅读 · 0 评论 -
并查集
代码int par[max_n]; //父亲数组int rank[max_n]; //树的高度void init(int n) { //初始化 for (int i = 0; i < n; i++) { par[i] = i; rank[i] = 0; }}int find(int x) { //查询树的根 if (par[x] == x) return x; else { return par[x] = find(par[x]); }}void原创 2021-02-14 19:49:02 · 186 阅读 · 1 评论 -
动态规划(DP)背包问题
记录结果再利用的"动态规划"DP做题的步骤> 1. 确定状态变量 dp[i]/dp[i][j]的含义;> 2. 确定状态转移方程;> 3. 确定边界条件;> 4. 确定递推顺序题目1:01背包有 n 个重量和价值分别为 w 和 v 的物品。从这些物品中挑选总重量不超过 W 的物品。求所有挑选方案中价值总和的最大值思路dp[i+1][j] 表示从前i个物品中选出总重量不超过j的物品时总价值的最大值;初始化:dp[0][j]=0,dp[i][0原创 2021-02-07 14:43:18 · 298 阅读 · 0 评论 -
日期(公式)
(知道年,月,日—>星期几)蔡基姆拉尔森计算公式: 年 月 日int whatday(int y, int m, int d) { if (m <= 2) { m += 12; y--; } return (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;}闰年计算:if ((y % 100 != 0 && y % 4 == 0原创 2020-10-14 19:19:58 · 329 阅读 · 0 评论 -
c++ 全排列函数
next_permutation()函数,作用是输出所有比当前排列 排列大的排列(顺序为由小到大排)例子#include<iostream>using namespace std;int main(){vector<int> nums{1,2,3};while(next_permutation(nums.begin(),nums.end())){ cout<<nums[0]<<nums[1]<<nums[2]&.原创 2021-02-04 11:06:59 · 1474 阅读 · 1 评论 -
搜索与回溯1
全排列#include<cstdio>#include<iostream>using namespace std;int n;int a[10],vis[10];void dfs(int x){ if(x>n){ for(int i=1;i<=n;i++){ cout<<a[i]<<" "; } cout<<endl; return ; } for(int i=1;i<=n;i++){原创 2020-10-24 18:20:13 · 209 阅读 · 0 评论 -
动态规划(DP)
动态规划计数有多少种方式走到右下角;有多少种方法选出 K 个数使得和是 m求最大最小值从左上角走到右下角路径的最大数字和最长上升子序列求存在性取石子游戏能不能选出 K 个数使得和是 m确定状态 最后一步(最优策略中使用的最后一枚硬币) 化成子问题(最少的硬币拼出更小的面值)转移方程 f[x]=min{f[x-2]+1,f[x-5]+1,f[x-7]+1}初始条件和边界情况 f[0]=0;如果不能拼出X,X=正无穷;计算顺序原创 2020-10-14 10:41:50 · 243 阅读 · 0 评论 -
最大公约数,最小公倍数
最大公约数辗转相除法用第一次的余数作为除数,第一次的除数作为被除数,如此往复;最后返回a;#include<stdio.h>int main(){ int a,b,c; scanf("%d %d",&a,&b); //a>b while(b){ c=a%b; a=b; b=c; } printf("%d\n",a); return 0;}递归int gcd(int a,int b){ return b?gcd(b,a%b):原创 2020-09-22 00:02:01 · 215 阅读 · 0 评论 -
位运算总结(C语言介绍)
位运算最近做LeetCode上面的题,好多都要进行位运算的操作,而且执行效率快的有点难以置信,所以,对此将位运算进行一次大总结1.“按位与”运算符(&);指的是参与运算的2个数,按二进制位进行“与”运算。如果相应的二进制数都位1,结果为1,否则为0;00000011&0000010100000001(结果)由此可知3&5=1;2.“按位或”运算符(|)2个相应二进制数进行“或”运算,只要有1个数为1,则结果为1;3.“异或”运算符(^)若2个二进原创 2020-06-04 16:49:06 · 359 阅读 · 0 评论 -
二分搜索(高级版本,不容易溢出)
因为上一个博客已经对二分搜索进行介绍,只不过上一个在做题时容易溢出,下面给出一个改进版本,适合做题,直接给出代码;int Binary_Search(int a[],int n,int key){ int left=1,right=n; while(left<=right){ int mid=left+(left+rigth)/2; if(a[mid]==key) return mid; if(a[mid]>key) right=mid-1; else left=mid.原创 2020-06-03 13:03:28 · 271 阅读 · 0 评论 -
2种搜索算法(C语言介绍)
线性搜索从名字也可以看出,这种搜索非常简单,就是利用 for 或者 while 进行一个一个搜索;一下皆是数组中没有重复元素的方法;for(int i=0;i<n;i++){ ------------}二分搜索从标题也可以理解,就是进行折半查找;下面给出代码;int Binary_Search(int a[],int n,int key){ int left=0,right=n; int mid; while(left <end){ mid=(left+ri原创 2020-06-03 11:37:04 · 570 阅读 · 0 评论 -
中缀转后缀(栈的应用 C语言介绍)
中缀表达式转后缀表达式从左到右进行扫描,若为数字直接输出;若为字符:<1> 若栈为空,直接入栈;<2> 若该操作符优先级大于栈出口操作符的优先级,直接入栈;<3>若优先级第于栈出口操作符的优先级,进行出栈操作;直到该操作符优先级大于栈出口操作符的优先级,再将该字符入栈;若为“(” 直接入栈;若为“)”,出栈操作,直到遇到“(”,包括“(”;若扫描完,栈中仍有字符,直接出栈;下面给出代码;#include<stdio.h&原创 2020-06-02 21:32:04 · 377 阅读 · 0 评论 -
简单队列及其循环队列的相关操作(C语言介绍)
队列的性质先进先出简单队列相对简单,下面给出代码;typedef struct { int *que; //内存,相当于数组 int end; //尾指针 int begin; //前指针 int count; //队列的当前容量} MaxQueue;MaxQueue* maxQueueCreate() { //队列的初始化; MaxQueue*obj=(MaxQueue*)malloc(sizeof(MaxQueue))原创 2020-06-02 17:03:20 · 302 阅读 · 2 评论 -
栈的相关操作(C语言介绍*LeetCode.155)
我的上一篇博客讲的是 逆波兰表达式的计算,正好利用了栈的特性,而在下一篇我要介绍怎样把中缀表达式转化为后缀表达式,又要用到栈的特性,所以,这篇博客中将栈总结一下,当然,要是学C++的话,就不用这么麻烦了,直接STL用就好了。 不多说了,下面对栈进行总结栈的性质后进先出;就好像一个开口的四棱柱;可以在LeetCode155进行练习;#define maxsize 1000typedef struct { int *data; int top;} Mi..原创 2020-06-02 16:42:42 · 346 阅读 · 0 评论 -
逆波兰表达式(后缀表达式的计算*C语言介绍)
逆波兰表达式这个主要是对栈的应用,如果不了解栈的同学先去了解一下栈哦,如果了解了,就当这句话不存在;是数字的话直接入栈;遇到运算符的话出栈2个数字进行运算,前者对后者进行运算;运算后的结果继续入栈;下面给出代码#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<math.h>#define STACK_INIT_SIZE 200#define原创 2020-06-01 17:38:55 · 1279 阅读 · 0 评论 -
排序算法总结(精讲*C语言介绍)
冒泡排序以下代码皆从小到大进行排序冒泡排序原理O(n^2)顾名思义,就是如同鱼儿在水中冒泡一样。比如(从小到大)就将最大的往上冒;当然,这就需要交换2个数的值了,话不多说,直接上餐#include<stdio.h>void Bubble_Sort(int a[],int n){ //冒泡排序 for(int i=0;i<n-1;i++){ //外层只需遍历到倒数第2个数 for(int j=i;j<n;j++){ if(a[i]>a[j原创 2020-06-01 17:09:52 · 318 阅读 · 0 评论