随笔分类 - 啊哈算法
C语言算法学习
摘要:要求:将 +-*/ 四个运算符,填写到 5 5 5 5 5 = 5,使得等式成立 由于C语言中,没有 python.eval 这样的内置函数,必须自己实现字符串到计算公式的转换。 #include <stdio.h>#include <stdlib.h>#include <conio.h>int m
阅读全文
摘要:一、二分图 如果一个图的所有顶点可以被分为X和Y两个集合,所有边的顶点恰好一个属于X,另一个属于Y,且集合内的点互不相连,这样的图成为二分图。 算法思路: 1.先从一个未匹配的点 u 开始,任选一条从 u 出发的边 u->v,若v未配对,return; 若v已经配对,尝试update原来的配对关系;
阅读全文
摘要:一、割点 -- 兵家必争之地: 在一个无向连通图中,如果删除某个顶点后,图不再连通,这样的顶点称为“割点”:即遍历图时寻找这样的点K,使得图被分成两部分,一部分已经访问过,一部分没有被访问过,没被访问的点集中至少有一个点在不经过K的情况下,到已经被访问过的点集距离是无穷大infinity! 1.最简
阅读全文
摘要:一、上节中的最小生成树,使用了快速排序算法;这节的最小生成树,模拟Dijkstra算法 1.既然是找一条路(最小生成树),将所有节点连接起来,那么随便选择一个顶点先,然后从这个顶点出发的边中,挑一个最短的边;然后再找一个距离这两个顶点最近的边和顶点,加入到图中,同时要避免回路;依次类推,直到加入图的
阅读全文
摘要:一、找出一条路,可以连接所有顶点,并且路径之和最小!《一个连通的无向图,且没有回路,那么这就是求一颗最小生成树》 思路: 1.要想总长度之和最小,那么应该从最短的边开始选取,将边进行由小到大排序; 2.从最小边开始选,并且要保证不能有回路,按照并查集算法,即判断两个点是否在同一个集合(有相同的父节点
阅读全文
摘要:暂时没看懂,只做记录,后续再究! 一、求有几个强盗同伙? 现在有10个强盗: 1与2是同伙; 3与4是同伙; 5与2是同伙; 4与6是同伙; 2与6是同伙; 8与7是同伙; 9与7是同伙; 1与6是同伙; 2与4是同伙; 强盗同伙的同伙,也是同伙。请问共有几个独立的强盗同伙? 解题思路: 1.首先假
阅读全文
摘要:一、树的初识 1. 树:不包含回路的、无向、连通图! <=> 于是树有许多特性: 1.一棵树中,任意两个节点有且仅有唯一的一条路径连通; 2.一棵树如果有 n 个节点,那么它一定恰好有 n-1 条边; 3.在一棵树中加一条边,将会构成回路! 2. 定义: 根节点:只有一个,它没有父节点; 叶节点:没
阅读全文
摘要:一、无论Floyd还是Dijkstra,算法的假设前提就是,没有负权边。 但是Bellman-Ford算法可以: if( dis[v[i]] > dis[u[i]] + w[i]) dis[v[i]] = dis[u[i]] + w[i]; u[i], v[i], w[i] 分别记录一条边的起点,终
阅读全文
摘要:一、简介: Dijkstra算法:指定一个点(源点),求其到其他点的最短路径。称之为“单源最短路径”. 一维数组 dis 记录源点到其余各点的初始距离: 1.先找到一个距离源点A最近的点B,(区别于上一节的假设:求两点之间的最短距离,必须引入另外的点),因为边最小,其他边都是正数,即使引入其他点也不
阅读全文
摘要:一、Floyd-Warshall 算法简介:简单优雅! 如果要让任意两点之间的路程变短,只能引入另外的点集(请不要带入两点之间线段最短的真理,这里不是直线!) 于是,可以将图的二维平面,任意两点之间的距离,通过引入其他的点,缩短路程,直到所有的点集相互之间路程都达到最短! for(k=1;k<=n;
阅读全文
摘要:重温一遍 No.4.3 层层递进-广度优先搜索:https://www.cnblogs.com/yalimy/p/15021065.html /* No.1 广度优先搜索,只找出最短路径层数即可struct node{ int x; //当前节点 int y; //层数};struct node q
阅读全文
摘要:一、要求:找出从节点1到节点5的全部路径和最短路径! /*有向图的深度优先遍历:打印所有路径,并找出最短路径#include <stdio.h>struct node{ //记录路径的stack,深度重试的时候,走过的距离也要回收,所以应该把路径也包含在深度搜索的参数里面 int x; //点下标
阅读全文
摘要:问题什么的就不介绍了,<<啊哈!算法>>第四章 第六节 一、先用广度优先算法 #include<stdio.h> // x,y表示格子的坐标,a[x][y]表示格子使用的水管型号1~6,0表示树木,进水口左上右下分别用1,2,3,4表示int a[10][10],book[10][10]={0};i
阅读全文
摘要:简单介绍:在一个二维格子上面的一点,其相邻的格子:0表示海洋,1~9表示陆地,求一个目标格子所在的岛面积。 注意:与目标点上下左右相链接的陆地视为同一岛屿,不纠结其他四个角! 一、广度优先 VS 深度优先 /* No.1 广度优先搜索#include <stdio.h>struct node{ //
阅读全文
摘要:求解,炸弹放在哪个位置,消灭的僵尸最多? //G=敌人, .=地面, #=墙壁,炸弹可以向上下左右四个方向无限杀敌,只要不遇到墙壁,位置必须可达,而且只能是地面 一、广度优先搜索 struct node { //广优必须有一个队列记录同一层的节点 int x; int y;};char map[20
阅读全文
摘要:一、深度优先搜索:从开始位置进行尝试,直到走不通的时候,再返回到上一层“递归“继续尝试 广度优先搜索:从开始位置起,搜索每一种可能路径并加入到队列,再从队列中的所有元素搜索所有的下一层可能路径,即首先穷尽最上层可能,再逐层递进,那么找到目标的那一刻,最短层数既是最短路径! 把此图顺时针旋转45度,呈
阅读全文
摘要:用迷宫试试二维平面中,深度优先算法的应用:求从出发位置到目标位置的最短路径,要求走过的路(格子)就不能再回头,有障碍物的格子不可通行。 #include <stdio.h> int a[50][50],book[50][50]; //平面边界与标记数组int n,m,p,q,min=10000; /
阅读全文
摘要:/*No.1 不撞南墙不回头-深度优先搜索向盒子里放扑克牌,每个盒子只能放一张,共有多少种放法? int a[10],book[10],n; //C变量默认初始化为0 void dfs(int step){ //step表示第几个盒子 int i; if(step==n+1) //n+1,表示所有的
阅读全文
摘要:一、计算一个公式,将数字1~9分别填入空格,要求每个数字出现一次,并使等式成立 int main(){ int a[10],i,total=0,book[10],sum; for(a[1]=1;a[1]<=9;a[1]++) for(a[2]=1;a[2]<=9;a[2]++) for(a[3]=1
阅读全文
摘要:一、链表简介 数组/列表:作为一个整体出现,只能在头、尾进行更新操作 链表:指针+动态分配内存函数malloc实现,每个元素都有一个后向指针,指明下一个元素的位置,尾元素有个空指针。 1.关于指针: int a=10, *p; // * 间接运算符,作用是取得指针 p 指向的内存地址保存的变量值 p
阅读全文
浙公网安备 33010602011771号