程序员Realeo
解决真正问题的程序员,而不是解决编程问题的程序员!
展开
-
Mysql索引数据结构
Mysql索引数据结构原创 2023-03-05 18:17:16 · 420 阅读 · 0 评论 -
LeetCode 50. Pow(x, n)
LeetCode刷题原创 2022-08-22 03:19:00 · 123 阅读 · 0 评论 -
第6章第4节-Bellman-Ford的队列优化
/*每次仅对最短路径估计值发生变化了的顶点的所有出边执行松弛操作*/#include "stdio.h"int main(){ int n,m,i,j,k; //u、v和w的数组大小要根据实际情况来设置,要比m的最大值要大1 int u[8],v[8],w[8]; //first要比n的最大值要大于1,next要比m的最大值要大1 int first[...原创 2019-04-14 13:59:58 · 186 阅读 · 0 评论 -
第6章第3节-Bellman-Ford-解决负权边
/*对所有的边进行n-1次的松弛操作检测一个图是否有负权回路:如果在n-1松弛之后最短路仍然会发生变化,则改图必然存在负权回路在实际操作中,Bellman-Ford算法经常会在未达到n-1轮松弛前就已经计算出最短路,n-1其实是最大值因此可以添加一个变量check用来标记数组dis在本轮松弛中是否发生了变化,如果没有发生变化,则可以提前跳出循环*/#include "stdio.h"i...原创 2019-04-14 13:57:29 · 238 阅读 · 0 评论 -
第6章第2节-Dijkstra算法-单元最短路径
/*单元最短路径:指定一个点(源点)到其余各个顶点的最短路径Dijkstra算法的主要思想:通过边来松弛源点到其余各个顶点的路程每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有顶点的最短路径:基本步骤如下:1.将所有的顶点分为两部分:已经最短路程的顶点集合P和未知最短路径顶点的集合Q。最开始,已知最短路径的顶点集合P中只有源点一个顶点。我们这里用book数...原创 2019-04-14 13:55:09 · 485 阅读 · 0 评论 -
第6章第1节-只有五行的算法-Floyd-Warshall
/*多源最短路径:求任意两个点之间的路径核心代码只有五行:for(k = 1;k <= n;k++) for(i = 1;i <= n;i++) for(j = 1;j <= n;j++) if(e[i][j] > e[i][k] + e[k][j]) e[i][j] = e[i][k] ...原创 2019-04-14 13:52:20 · 189 阅读 · 0 评论 -
第5章第3节-最少转机-图的广度优先遍历
/*使用广度优先搜索求转机次数最少,不考虑之间距离*/#include "stdio.h"struct note{ int x;//城市编号 int s;//转机次数};int main(){ struct note que[2501]; int e[51][51] = {0},book[51] = {0}; int head,tail;...原创 2019-04-14 13:49:11 · 268 阅读 · 0 评论 -
第5章第2节-城市地图-图的深度优先遍历
/*图的基本概念:图就是有N个顶点和M条边组成的集合。图分为有向图和无向图,如果给图的每条边规定一个方向,那么得到的图称为有向图,其边也称为有向边,在有向图中,与一个点相关联的边有出边和入边之分,而与一个有向边关联的两个点也有始点和终点之分。在寻找最短路径问题上,有向图和无向图所得到结果可能不一样,例如本题有向图最短路径:1->2->5,长度为9。无向图最短路径:1->...原创 2019-04-14 13:46:53 · 301 阅读 · 0 评论 -
第5章第1节-深度和广度优先究竟是指啥-广度生成树
/*广度优先遍历的主要思想:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻未被访问过的顶点,直到所有顶点都被访问过,遍历结束。图的邻接矩阵存储法:利用一个二维数组来存储,第i行第j列表示的就是顶点i到顶点j是否有边。1表示有边,∞表示没有边,将自己到自己设为0.变量的作用:cur存储的是当前正在遍历的顶点,二维数组e存储的就是图的边...原创 2019-04-14 13:45:02 · 185 阅读 · 0 评论 -
第5章第1节-深度和广度优先究竟是指啥-深度生成树
/*深度优先遍历的主要思想:首先以一个未被访问过的顶点作为起始点,沿着当前顶点的边走到未被访问过的顶点,当没有访问过的顶点时,则返回上一个顶点,继续试探访问其他顶点,直到所有顶点都被访问过。显然,深度优先遍历是沿着图的某一条分支遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。图的邻接矩阵存储法:利用一个二维数组来存储,第i行第j列表示的就是顶点i到顶点...原创 2019-04-14 13:43:12 · 227 阅读 · 0 评论 -
第6章第5节-最短路径算法对比分析
算法名称 Floyd Dijkstra Bellman-Ford 队列优化的Bellman-Ford空间复杂度 O(N²) O(M) O(M) ...原创 2019-04-15 15:38:12 · 206 阅读 · 0 评论 -
第7章第3节-堆-神奇的优先队列-最大堆排序
/*堆排序的时间复杂度和快速排序一样也是O(NlogN)*/#include "stdio.h"int h[101];//用来存放堆的数组int n;//用来存储堆中元素的个数,也就是堆的大小//交换函数,用来交换堆中两个元素的值void swap(int x,int y){ int t; t = h[x]; h[x] = h[y]; h[y] = t...原创 2019-04-15 15:41:23 · 210 阅读 · 0 评论 -
第8章第5节-我要做月老-二分图最大匹配-匈牙利算法
/*二分图的定义:如果一个图所有顶点可以被分为X和Y两个集合,并且所有边的两个顶点恰好一个属于集合X,另一个属于集合Y,即每个集合内顶点没有边相连,那么此图就是二分图步骤如下:1.首先从任意一个未被配对的点u开始,从点u的边中任意选一条边(假设这条边是u->v)开始配对。如果此时v还没有被配对,则配对成功,此时便找到一条增广路(只不过这条增广路比较简单)。如果此时v已经被配对,那...原创 2019-04-15 15:58:39 · 226 阅读 · 0 评论 -
第8章第4节-关键道路-图的割边
/*割边(桥):即在一个无向连通图中,如何删除某条边之后,图不在连通如果low[v]和num[u]相等则表示还可以回到父亲,而low[v] > num[u]则表示连父亲都回不到了。倘若顶点v不能回到祖先,也没有另外一条路能回到父亲,那么u-v这条边就是割边实际应用中需要改为邻接表来存储图,时间复杂度为OM((N + M)),否则时间复杂度为O(N2)*/#include "std...原创 2019-04-15 15:55:47 · 255 阅读 · 0 评论 -
第8章第3节-重要城市-图的割点
/*在一个无向连通图中,如果删除某个顶点后,图不再连通(即任意两点之间不能相互到达),我们称这样的顶点为割点(或称为割顶)。如果k点是割点,那么剩下的没有被访问过的点至少会有一个点在不经过k点的情况下,是无论如何再也回不到已访问过的点了。那么一个连通图就被割点分割成多个不连通的子图了当深度优先遍历访问到顶点u时,假设图中还有顶点v是没有访问过的点,如何判断顶点v在不经过顶点u的情况下是...原创 2019-04-15 15:53:07 · 280 阅读 · 0 评论 -
第8章第2节-再谈最小生成树-堆优化后的Prim算法
/*Prim算法的时间复杂度为O(N2),如果借助堆,每次选边的时间复杂度是O(logM),然后用邻接表来存储图的话,整个时间复杂度会降到O(MlogN)*/#include "stdio.h"int dis[7],book[7] = {0};//book数组用来记录哪些顶点已经放入生成树中int h[7],pos[7],size;//h用来保存堆,pos用来存储每一个顶点在堆中的位置...原创 2019-04-15 15:51:28 · 459 阅读 · 1 评论 -
第8章第2节-再谈最小生成树-Prim算法
/*Prim的时间复杂度为O(N2)算法流程:1.从任意一个顶点开始构造生成树,假设就从1号顶点吧,首先将顶点1加入生成树中,用一个一维数组book来标记哪些顶点已经加入了生成树。2.用数组dis记录生成树到各个顶点的距离。最初生成树只有1号顶点,有直连边时,数组dis中存储的就是1号顶点到改顶点的边的权值,没有直连边时就是无穷大,即初始化dis数组。3.从数组dis中选择出离生成树...原创 2019-04-15 15:49:42 · 481 阅读 · 0 评论 -
第8章第1节-镖局运镖-图的最小生成树-Kruskal算法
/*首先按照边的权值进行从小到大排列,每次从剩余的边中选择权值较小且边的两个顶点不在同一个集合内的边(就是不会产生回路的边),加到生成树之中,直到加入了n-1条边为止。*/#include "stdio.h"struct edge{ int u; int v; int w;};//为了方便排序,这里创建了一个结构体用来存储边的关系struct edge e[...原创 2019-04-15 15:47:32 · 415 阅读 · 0 评论 -
第7章第4节-擒贼先擒王-并查集
/*并查集算法:并查集通过一个一维数组来实现,其本质是维护一个森林。刚开始的时候,森林的每个点都是孤立的,也可以理解为每个点就是一棵只有一个点的树,之后通过一些条件,逐渐将这些树合并成一棵大树。*/#include "stdio.h"int f[1001] = {0},n,m,sum = 0;//这里是初始化,非常的重要,数组里存的是自己的数组下标的编号就好了void init()...原创 2019-04-15 15:45:08 · 260 阅读 · 0 评论 -
第7章第3节-堆-神奇的优先队列-最小堆排序
/*堆排序的时间复杂度和快速排序一样也是O(NlogN)*/#include "stdio.h"int h[101];//用来存放堆的数组int n;//用来存储堆中元素的个数,也就是堆的大小//交换函数,用来交换堆中两个元素的值void swap(int x,int y){ int t; t = h[x]; h[x] = h[y]; h[y] = t...原创 2019-04-15 15:43:09 · 148 阅读 · 0 评论 -
第4章第6节-水管工游戏
/*游戏规则:一块矩形土地被分为N*M的单位正方形,现在这块土地上已经埋设有一些水管,水管将从坐标为(1,1)的矩形土地的左上角左部边缘,延伸到坐标为(N,M)的矩形土地的右下角右部边缘,水管只有弯管和直管两种管道,每种管道占据一个单位正方形土地,可以旋转管道,使其构成一个管道系统,即创造一条从(1,1)到(N,M)的连通管道,标有树木的地方表示这里没有管道。定义:0表示没有管道,1...原创 2019-04-14 13:39:43 · 290 阅读 · 0 评论 -
第4章第5节-宝岛探险-Floodfill算法
/*想知道地图中有多少个独立的小岛,并对不同独立小岛染色从(1,1)开始枚举,一直枚举到(n,m)*/#include "stdio.h"int a[51][51],book[51][51];int n,m,sum;void dfs(int x,int y,int color){ //定义一个表示走的方向的数组 int next[4][2] = {{0,1},{1,...原创 2019-04-14 13:24:21 · 224 阅读 · 0 评论 -
第4章第5节-宝岛探险-广度优先搜索
/*0表示海洋,1~9表示陆地,数字大小代表海拔高度小哼的飞机降落在(6,8)处,现要计算出小哼将落地所在岛屿的面积(即有多少个格子)注意此处我们把与小哼降落点上下左右相连接的陆地均视为同一岛屿*/#include "stdio.h"struct note{ int x;//横坐标 int y;//纵坐标};int main(){ struct not...原创 2019-04-13 17:35:32 · 229 阅读 · 0 评论 -
第2章第4节-链表-链表输出
/************************************************示例输入: * 9 * 2 3 5 8 9 10 18 26 32 *...原创 2019-04-12 10:42:51 · 199 阅读 · 0 评论 -
第2章第4节-链表-链表插入
/************************************************示例输入: * 9 * 2 3 5 8 9 10 18 26 32 *...原创 2019-04-12 10:41:38 · 105 阅读 · 0 评论 -
第2章第3节-纸牌游戏-小猫钓鱼
/*队列、栈的综合应用*//*游戏规则:将一副扑克牌平均分成两份,每人各拿一份。小哼拿出第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上的某张牌的牌面相同时,即可将两张相同牌及其中间所夹牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部取出时,游戏结束,对手获胜。*//****...原创 2019-04-12 10:39:28 · 453 阅读 · 0 评论 -
第2章第2节-解密回文-栈
/**********************************************************************字符串是回文的话,那么它必须是中间对称的判断回文的关键步骤:将字符串前半段字符入栈,然后依次出栈,看看能否与mid之后的字符一一匹配,如果都匹配则说明这个字符串是回文字符串,否则这个字符串就不是回文字符串。*********************...原创 2019-04-12 10:33:07 · 168 阅读 · 0 评论 -
第2章第1节-解密QQ号-队列
/************************示例输入: * 6 3 1 7 5 8 9 2 4 *示例输出: * 6 1 5 9 4 7 2 8 3 *************************/#include <stdio.h>struct queue{ ...原创 2019-04-12 10:30:40 · 174 阅读 · 0 评论 -
第1章第4节-小哼买书
//去重;排序/*****************************************示例输入: * 10 * 20 40 32 67 40 20 89 300 400 15 *示例输出 ...原创 2019-04-12 10:14:44 · 144 阅读 · 0 评论 -
第1章第3节-最常用的排序-快速排序
/**********************************************************************************************************关键字:基准数,先从右找比基准数小的数,再从左往右找比基准数大的数,交换。当左右相遇则相遇点与基准数交换。*因此快速排序的最差时间复杂度和冒泡排序是一样的,都是 O(N2), ...原创 2019-04-12 10:12:47 · 175 阅读 · 0 评论 -
第1章第2节-邻居好说话-冒泡排序
/*冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。*//*冒泡排序的时间复杂度为O(N²)*///#include <stdio.h>//int main()//{// int a[100], i, j, t, n;// scanf("%d", &n); //输入一个数n,表示接下来有n个数// for(i =...原创 2019-04-12 10:10:58 · 162 阅读 · 0 评论 -
第2章第5节-模拟链表
/*具体原理:第一个整形数组data是用来存放序列中具体数字的,另外一个整形数组right用来存放当前序列中每一个元素右边元素在数组data中的位置的。*/#include <stdio.h>int main(){ int data[101],right[101]; int i,n,t,len; //读入已有的数 scanf("%d",&...原创 2019-04-12 10:44:15 · 123 阅读 · 0 评论 -
第3章第1节-坑爹的奥数-枚举法
/*□□□ X □□□ = □□□ 将数字1 ~ 9填入□中使等式成立,每个数字只能使用一次例:173 + 286 = 459 和286 + 173 = 459是同一种组合*/#include<stdio.h>int main(){ int a[10],i,total = 0,book[10],sum; //用a[1] ~a[9]表示9个□的数 for...原创 2019-04-12 10:46:20 · 359 阅读 · 0 评论 -
第3章第1节-坑爹的奥数-深搜
#include "stdio.h"int a[10],book[10],total = 0;void dfs(int step)//step表示站在第几个盒子面前{ int i; if(step == 10)//如果站在第十个盒子面前,表示前九个盒子已经放好扑克牌 { //判断□□□ X □□□ = □□□是否满足 if(a[1]...原创 2019-04-13 17:14:19 · 208 阅读 · 0 评论 -
第4章第5节-宝岛探险-深度优先搜索
/*0表示海洋,1~9表示陆地,数字大小代表海拔高度小哼的飞机降落在(6,8)处,现要计算出小哼将落地所在岛屿的面积(即有多少个格子)注意此处我们把与小哼降落点上下左右相连接的陆地均视为同一岛屿*/#include "stdio.h"int a[51][51],book[51][51];int n,m,sum;void dfs(int x,int y){ //定义一个表示...原创 2019-04-13 17:34:21 · 199 阅读 · 0 评论 -
第4章第4节-再解炸弹人-广度优先搜索
/*广度优先搜索解炸弹人*//*#表示墙、G表示敌人、.表示空地问炸弹放在那个位置才可以消灭最多的敌人示例输入: 13 13 3 3 ############# #GG.GGG#GGG.# ###.#G#G#G#G# #.......#..G# #G#.###.#G#G# #GG.GGG.#.GG# #G#.#G#.#.#.#...原创 2019-04-13 17:32:49 · 166 阅读 · 0 评论 -
第4章第4节-再解炸弹人-深度优先搜索
/*广度优先搜索解炸弹人*//*#表示墙、G表示敌人、.表示空地问炸弹放在那个位置才可以消灭最多的敌人示例输入: 13 13 3 3 ############# #GG.GGG#GGG.# ###.#G#G#G#G# #.......#..G# #G#.###.#G#G# #GG.GGG.#.GG# #G#.#G#.#.#.#...原创 2019-04-13 17:31:17 · 259 阅读 · 0 评论 -
第4章第3节-层层递进-广度优先搜索
/*层层递进-广度优先搜索*/#include "stdio.h"struct note{ int x;//横坐标 int y;//纵坐标 int f;//父亲在队列中的编号,本题不要求输出路径,可以不需要f int s;//步数};int main(){ struct note que[2501];//因为地图大小不超过50*50,因此队...原创 2019-04-13 17:29:20 · 409 阅读 · 1 评论 -
第4章第2节-解救小哈
/*迷宫最短路径问题,0表示可通过,1表示障碍物不能通过*/#include "stdio.h"int n,m,p,q,min = 99999999;int a[51][51],book[51][51];void dfs(int x,int y,int step){ int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//next为方向数组,...原创 2019-04-13 17:27:42 · 269 阅读 · 0 评论 -
第4章第1节-不撞南墙不回头-深度优先搜索
/*使用深度优先搜索解决数的全排列问题*//*深度优先搜索的基本模型:void dfs(int step){ 判断边界 尝试每一种可能 for(i = 1;i <= n;i++) { 继续下一步 dfs(step + 1); } 返回}*/#include "stdio.h"int a[10],book[10],n;//此处特...原创 2019-04-13 17:24:12 · 430 阅读 · 0 评论