算法笔记
PDYJ
这个作者很懒,什么都没留下…
展开
-
|打表、进制转换、map、数组、数字和字符转换|PAT乙级1044火星数
linkrefer空间换时间感觉是思考的站的角度不同打表,就是把输入的数据看成一个整体,去思考,去分类,否则,则只拘泥于某个数据,针对这个数据而去具体化操作#include <iostream>#include <string> #include <cstring> #include <cstdio>#include <map>using namespace std;string unit[13] = { "tre原创 2020-11-25 11:01:22 · 91 阅读 · 0 评论 -
打表法
refer在程序中一次性计算出所有需要用到的结果,之后的查询直接取这些结果打一张表格,把需要的东西都保存下来//打表的概念/*数1的个数题目描述给定一个十进制正整数n(1<=n<=10000),写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数。例如当n=2时,写下1,2.这样只出现了1个“1”;当n=12时,写下1,2,3,4,5,6,7,8,9,10,11,12。这样出现了5个“1”。输入有多组输入,每组输入占一行。每一行有一个数字n。-----原创 2020-11-25 09:37:53 · 980 阅读 · 0 评论 -
Dijkstra多重筛选条件模板(点权具体分析_边权_条数_多条==<>_结构体排序)
|Dijkstra + 多重条件判断(点权)+map映射+dfs打印路径|L3-011 直捣黄龙1030 Travel Plan (30分)//求:起点到终点的最短路径,最短距离,以及花费//如果有多条最短路径,则选择花费最小的那条1003 Emergency (25分)现在给出起点和终点,求从起点到终点的最短路径条数以及最短路径上的救援小组数目之和。如果有多条最短路径,则输出数目之和最大的----------点权和L3-005 垃圾箱分布 (30分)//最短距离最长//输出到所有居民点原创 2020-11-14 09:16:34 · 224 阅读 · 0 评论 -
|Dijkstra + 多重条件判断(点权)+map映射+dfs打印路径|L3-011 直捣黄龙
refer题意:找到己方大本营到敌方大本营的一条最短路径,当这样的路径有多条时选择解放最多城镇的路径 (就是经过的城市越多越好),当这样的路径也有多条时选择杀敌数最多的路。方法:Dijkstra (模板)+ 多重条件判断。数据处理:用map容器对表示城市的字符串做数据映射,使得城市可以用0到N-1表示,方便建立邻接矩阵,然后套上最短路径模板 + 三个条件判断。题目要求求己方大本营PAT到达敌方大本营DBY的最短路径且满足3个条件。根据图中可知,最短路径为30,且这样的路径有3条:(第原创 2020-11-14 08:10:35 · 410 阅读 · 0 评论 -
|stoi+Dijkstra+结构体排序|L3-005. 垃圾箱分布 - Dijkastra模板题 -天梯赛练习
referreferlink原创 2020-11-11 22:11:34 · 99 阅读 · 0 评论 -
|Dijkstra+dfs打印最短路径、多条最短路径、最小花费边权|1030 Travel Plan (30分)
link//给出城市数(顶点数)、道路数(边数 无向边)、起点、终点、距离(边权)、花费(边权)//求:起点到终点的最短路径,最短距离,以及花费//如果有多条最短路径,则选择花费最小的那条/*4 5 0 30 1 1 201 3 2 300 3 4 100 2 2 202 3 1 200 2 3 3 40*///1.Dijkstra//2.Dijkstra+dfs//今天,我们用第1种方法//边权的存储#include <iostream>usin原创 2020-11-11 08:47:34 · 343 阅读 · 0 评论 -
多条最短路径_边权_点权_数目_模板
从起点到终点的距离的最短距离最小的路径不止一条,于是给定起点和终点,有2种及以上的最短距离的路径,那么题目会这么问:1.每条边再增加1个边权(比如花费),然后在最短路径有多条时,求路径上的花费之和最小2.给每个点增加1个点权(每个城市能收集到的物资),然后在最短路径有多条时,求路径上收集的物资之和最多3.直接问有多少条最短路径我们只需要再增加1个数组来存放新增的边权或点权或者最短路径条数然后只需要在Dijkstra算法中修改d[v]的那个步骤即可1.新增边权边权—>花费最短原创 2020-11-09 11:04:27 · 856 阅读 · 0 评论 -
|Dijkstra 多条最短路径|1003 Emergency (25分)
link/*给出N个城市,M条无向边每个城市中都有一定数目的救援小组,所有边权已知。现在给出起点和终点,求从起点到终点的最短路径条数以及最短路径上的救援小组数目之和。如果有多条最短路径,则输出数目之和最大的----------点权和*//*5 6 0 21 2 1 5 30 1 10 2 20 3 11 2 12 4 13 4 1*/#include <iostream>using namespace std;const int N = 1000;con原创 2020-11-09 10:32:06 · 180 阅读 · 0 评论 -
|一条最短路径Dijkstra u->v的各个距离|中二的精灵岛拯救计划
给定图G(v,e),求一条从起点到终点的路径,使得这条路径上经过的所有边的边权之和最小对任意给出的图G(v,e)和起点S,终点T,如何求从S到T的最短路径从V1->V4,最短距离是2,对应的路径为{V1->V3->V4}解决最短路径问题的常用算法:Dijkstra,用于解决单源最短路问题即给定图G和起点s,通过算法得到s到达其他每个顶点的最颠路径对图G(V,E)设置集合S,存放已经被访问的顶点,然后每次从集合V-S中选择与起点s的最短距离最小的一个顶点(记作u.原创 2020-11-08 10:50:39 · 187 阅读 · 0 评论 -
树&图的存储&遍历分类模板
树&图树:从根节点/某个节点遍历存储:vector<int>child[N];记录每个节点的孩子节点编号//1-》多f_id child_id..f_id 对应孩子下标--转换L2-026 小字辈 (25分)vector<int>parent[N]; 记录每个节点的父母节点编号//1-》多L2-016 愿天下有情人都是失散多年的兄妹 (25分)int father[N]; 记录每个节点的父亲节点编号//多-》1L2-030 冰岛人 (25分)原创 2020-11-08 10:11:13 · 111 阅读 · 0 评论 -
1154 Vertex Coloring (25 分)ing。。。。。
refer原创 2020-11-07 20:49:46 · 83 阅读 · 0 评论 -
|扫一圈相邻的点,不dfs,hash散列vis,vector初始化赋值|1134 Vertex Cover (25分)
link#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <map>#include <set>#include <string>using namespace std;int main(){ int n, m, k, nv, a, b, num; scanf("%d%d",原创 2020-11-06 21:26:20 · 87 阅读 · 0 评论 -
树的静态写法_总结_模板(ing.............
111111原创 2020-11-05 14:32:01 · 288 阅读 · 0 评论 -
DFS/BFS深度优先遍历经典例题总结
dfsbfs原创 2020-11-04 15:15:37 · 843 阅读 · 0 评论 -
图dfs--不是算法
邻接矩阵存储图信息深度遍历的图!!!邻接表存储图信息原创 2020-10-31 11:09:11 · 73 阅读 · 0 评论 -
bfs图模板
邻接矩阵版int n;int G[N][N];bool inq[N]={false};void bfs(int v){ queue<int>q; q.push(v); inq[v]=true;//标记v已经如果队列 while(!q.empty()){ int v=q.front(); q.pop(); for(int i=0;i<n;i++){ //如果v的邻接点i未曾加入过队伍 if(inq[v]==false&&G[v][i]原创 2020-11-01 20:47:36 · 175 阅读 · 0 评论 -
|邻接表bfs遍历图|1076 Forwards on Weibo (30分)
//在微博,当用户发布一条信息时//他的关注者可以看到这条信息并且选择是否转发它//且转发的信息可以被被转发者的关注者再次转发//但是同一用户最多只能转发该信息一次(信息的最初发布者不能转发该信息)//现在给出N个用户的关注情况(即他们各自关注了哪些用户)//以及一个转发层数的上限L-----------高度//并给出最初发布消息的用户编号,球在转发层数上限内最多会被多少用户转发//咋觉得是求节点数目呢?//7 3 n用户个数 l转发层数上限//接下来n行(顶点编号1~n)//M.原创 2020-10-31 20:54:43 · 91 阅读 · 0 评论 -
|不懂|1021 Deepest Root (25 分)--PAT甲级
题目大意:找到使一棵树深度最大的所有根节点,若不为树,则输出连通分量个数。先一遍dfs得到深度最大的所有点的集合,再从集合中随便找一个节点,从该点出发再做一遍dfs,得到另一个深度最大的所有点的集合,两个集合的并集即为结果。也可以直接暴力法:对每个节点做一遍dfs,将得到的深度最大的节点记录下来。暴力:#include<iostream>#include<cstdio>#include<cstring>#include<cmath>.原创 2020-10-31 11:12:10 · 94 阅读 · 0 评论 -
图的深度遍历—一道入门级的dfs水题
请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出。遍历时,先遍历节点编号小的。Input1表示数据的组数4 4k,m表示有m条边,k个顶点。下面的m行,0 1u,v,表示一条连接u,v顶点的无向边。0 20 32 3输入第一行为整数n(0 < n < 100),表示数据的组数。 对于每组数据,第一行是两个整数k,m(0 < k < 100,0 < m < k*k),表示有m条边,k个顶点。 下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v原创 2020-10-31 09:44:15 · 363 阅读 · 0 评论 -
树(静态写法_有无点权)的遍历&图(邻接矩阵/邻接表)的遍历的区别|模板
(一)树(静态写法_有无点权)二叉树(无点权):vector<int> child[110];child[i].push_back(tmp);dfs(1,1);//从根结点(1)开始遍历树,并从根节点所在的第一层开始遍历if(child[index].size()==0){}for(int j=0;j<child[index].size();j++){dfs(G[index][j],depth+1);}//输出每层叶子节点数&总层数//n m// id k c原创 2020-10-30 09:52:12 · 171 阅读 · 0 评论 -
!马住_还没进行编号转换!|并查集_max父节点、邻接矩阵dfs遍历图连通块|1034 Head of a Gang (30)
//A "Gang" is a cluster of more than 2 persons //who are related to each other with total relation weight being greater than a given threshold K// The weight of a relation // is defined to be the total time length of all the phone calls // made betwee原创 2020-10-29 13:04:11 · 108 阅读 · 0 评论 -
树和图的区别、联系(树是有向无环的特殊的图)
树是图(树是图的子集),图不一定是树树有一个根节点,图没有树可以递归遍历,图要看情况树有层次划分,图没有树是一种“层次”关系,图是“网络”关系线性表中数据元素仅有线性关系,树则具有明显的层次性,而图的复杂性要远远超过线性表和树.在图中结点之间的关系是任意的,任何两个结点都可能相关,因此图能用来解决现实世界中一些极其复杂问题.例 (Example)Tree:树:Graph:图形:树数据结构树,和图一样也是一系列点的集合。有一个根节点。这个根节点有一些子节点.原创 2020-10-29 09:28:03 · 24289 阅读 · 5 评论 -
dfs遍历图
dfs是以深度为第一关键词每次都沿着路径到不能再前进时才退回到最近的岔道口沿着一条路径直到无法继续前进才退回到路径上里当前顶点最近的&还存在未访问的岔道口并前往访问那些未访问的分支顶点直到遍历完这个图dfs的具体实现2个概念:1)连通分量:2个顶点联通:2个顶点之间可以互相到达(无向图中)====》联通图:图G(V,E)的任意2个顶点都联通(无向图)连通图的连通分量一个,但是非联通图的联通分量有多个连通分量:极大的联通子图link求图的连通分量的目的,原创 2020-10-29 08:48:53 · 1890 阅读 · 0 评论 -
!并查集未完待续!|图的遍历/并查集--连通块数dfs|1013 Battle Over Cities (25分)
link//图的遍历//给定1个无向图并规定: //当删除图中某个顶点的时候,与之链接的边一起删除//接下来给出k个查询 //每个查询给出1个欲删除的顶点编号,求删除该顶点(和与其链接的边)后需要增加多少条便,才能让图联通//3 2 3--n,m,k------城市数,道路数,需要检查(删除)的城市数---------------这咋又让我想到了红色警报//随后m行//1 2-----某条道路2端的2个城市编号//1 3-----某条道路2端的2个城市编号//1 2 3--------原创 2020-10-28 18:46:34 · 142 阅读 · 0 评论 -
|并查集,e[][]=1二维数组表示关系|L2-010 排座位 (25分)
link这道题让我莫名想到了红色警报,RA那道题使用struct Road{int a,b}road[10010]来存储道路的两端,也就是相邻的2个城市可能都是要存储2个节点的关系1.二维数组—友好/敌对2.结构体–某个下标的结构体的a对应的b存在–某种关系(题目给出)//结构体,这题不行啊 //因为结构体的话,你要遍历关系,那不是顺序输出很多没用的信息?//如果是数组,就一一精准的找到了对应的关系//给定任意一对客人,判断是否能被安排同席 //两个人不是死对头//输入//原创 2020-10-28 10:20:55 · 148 阅读 · 0 评论 -
|并查集,编号未知|L2-024 部落 (25 分)
注意编号啊可能很大,没有规定不知道为什么 set不起作用//朋友的朋友在一个部落里//在一个给定的社区,有几个互不相交的部落?//并且检查任意2个人是否属于同一个部落?//4-----------第一行给出 小圈子的个数n//随后n行,按以下格式给出一个小圈子里的人//k p[1] p[2]...p[k] //k是小圈子的人数 //p[i]是小圈子每个人的编号,每个人的编号从1开始 //3 10 1 2 //2 3 4 //4 1 5 7 8 //3 9 6 4//2---原创 2020-10-27 11:30:01 · 125 阅读 · 1 评论 -
|每删一个节点计算块数,判断连通性|L2-013 红色警报 (25 分)
天梯 并查集link【解题思路】每一次都要重新判断一下需要连接的道路变化有无影响有影响的情况比较难找,那就直接先判断没有影响的情况就是等于前集合数目等于现集合数目或原集合数目+1等于现集合数目(因为题意,若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报)这样即使去掉当前结点也无碍如果连通块数组不变或者减1(原来就是孤立得一个),说明图连通块数目不受影响如果连通块数目增加了1,则说明连通块加1,图中连通性受到影响//输入//第一行 n,m原创 2020-10-26 17:34:29 · 379 阅读 · 0 评论 -
|并查集 与谁合并?|1107 Social Clusters (30分)
1107 Social Clusters (30分)link比如7很有可能 7是爱好6 8 1 的领头羊(第一个喜欢的)(后面爱好6 8 1的人会和7在一个组)但是 7 也是 爱好5 的小喽喽(所以7和爱好5的领头羊2 在一个组)(原本因为爱好6 8 1跟随7的小喽喽 也会和2在一个组)int main() { int n, k, h; cin >> n; init(n);//人的编号从1开始//////////////////////1.初始化 for (int i =原创 2020-10-26 16:22:28 · 88 阅读 · 0 评论 -
|并查集例题|好朋友(组数)(各组元素个数)
//A和B是好朋友--》B和A是好朋友//如果A和C是好朋友,而B和C也是好朋友,则A和B也是好朋友//人的个数 //好朋友组数//?和?'是好朋友//输入://4 2//4个人,2组好朋友----A和B、B和A算同一组//1 4//1和4是好朋友//2 3//2和3是好朋友//输出://这些人可以分成的组数----块--团//2//“组”视为集合//“好朋友的关系”视为2个节点的便//-----------------并查集操作//组合的个数就是要求的组数//对于原创 2020-10-26 14:47:45 · 597 阅读 · 0 评论 -
AVL的查找操作
void search(node* root,int x){ if(root==NULL){ printf("search failde");//空树,查找失败 return; } if(x==root->v){//查找成功,访问之 printf("%d\n",root->v); }else if(x<root->v){ search(root->lchild,x); }else{ search(root->rchild,x); }}原创 2020-10-26 11:19:26 · 435 阅读 · 0 评论 -
|Codeup|| bfs遍历树找值hash|dfs|算法9-9~9-12:平衡二叉树的基本操作
link算法9-9~9-12:平衡二叉树的基本操作在本题中,读入一串整数,首先利用这些整数构造一棵平衡二叉树。另外给定多次查询,利用构造出的平衡二叉树,判断每一次查询是否成功。输入输入的第一行包含2个正整数n和k,分别表示共有n个整数和k次查询。其中n不超过500,k同样不超过500。第二行包含n个用空格隔开的正整数,表示n个整数。第三行包含k个用空格隔开的正整数,表示k次查询的目标。样例输入8 31 3 5 7 8 9 10 159 2 5输出只有1行,包含原创 2020-10-26 11:11:50 · 373 阅读 · 0 评论 -
|AVL建树,层序遍历树,CBT判断|PAT1123 AVL树的调整与判断完全二叉树
pat 1022(AVL树+完全二叉树)1066 Root of AVL Tree (25分)PAT1123 AVL树的调整与判断完全二叉树link1110 Complete Binary Tree (25分)1064 Complete Binary Search Tree (30分)考察点,二叉平衡树、层序遍历和完全二叉树,888 70 61 96 120 90 65 68#include <stdio.h>#include <string.h>#includ原创 2020-10-25 17:20:30 · 124 阅读 · 0 评论 -
树节点的高度
https://blog.csdn.net/qq_36667170/article/details/84142019原创 2020-10-25 15:39:24 · 470 阅读 · 0 评论 -
|AVL模板|A 1066 Root of AVL Tree
link#include<iostream>#include<stdio.h>#include<stdlib.h>#include<algorithm>using namespace std;struct node{ int v;//结点数据 int height;//结点高度 node* lchild; node* rchild;} *root;node* newnode(int v)//创建一个新结点,新结点的高度置为1原创 2020-10-25 15:26:58 · 102 阅读 · 0 评论 -
AVL平衡二叉树
bst的缺陷如果用序列{1,2,3,4,5}构建二叉查找树bst(左孩子节点<根节点,右孩子节点>=根节点)会得到下图的二叉查找树这棵bst是链式的。对这棵树中节点进行查找的复杂度就会达到O(n),起不到使用bst来进行数据查询优化的目的。于是,我们需要对树的结构进行调整,使得树的高度在每次插入元素后仍然保持O(logn)的级别这样查询操作依然是O(logn)的时间复杂度,于是就产生了平衡二叉树AVL。AVL树,即平衡二叉树仍然是一棵二叉查找树,只是在其基础上增加了"平转载 2020-10-19 17:25:13 · 207 阅读 · 0 评论 -
C++结构体指针的使用
访问结构体内的元素".“操作和”->"操作struct stuInfo{ int id; char name[20]; stuInfo* next;}stu,*p;//访问stu中变量stu.idstu.namestu.next//访问指针变量p中的元素p->idp->namep->next//链表的麻烦之处,就是每次要插入一个新的节点,//都要从root编号节点开始遍历,寻找合适的插入位置(root==NULL)struct node{.原创 2020-10-18 15:21:12 · 916 阅读 · 0 评论 -
C++引用
函数的参数是作为局部变量的对局部变量的操作不会影响外部的变量如果想要修改传入的参数,那么只能使用指针// a2:2,b2:1 void swap2(int* a,int* b){//交换2个指针指向的2个地址的值 int tmp=*a; *a=*b; *b=tmp; } int a2=1,b2=2; swap2(&a2,&b2);//比较时只需要调用swap_1(&a,&b);发送地址即可。有了函数和指针的思想原创 2020-10-18 14:25:20 · 61 阅读 · 0 评论 -
PAT_bst
https://www.cnblogs.com/BlueBlueSea/p/9593332.htmlhttps://blog.csdn.net/weixin_43107805/article/details/107448803#1115%C2%A0Counting%20Nodes%20in%20a%20BST%C2%A0%2830%E5%88%86%29https://blog.csdn.net/weixin_43107805/article/details/106958867https://www.原创 2020-10-16 17:55:13 · 103 阅读 · 0 评论 -
|bst中序建树_填值_层序输出_树静态写法_左右孩子|1099 Build A Binary Search Tree (30分)
//二叉树有n个节点,编号0~N-1//给出每个左右孩子节点的编号(不存在用-1表示)//接着给出一个N个整数的序列,需要把这N个整数填入二叉树的节点中//使得二叉树成为bst,输出这棵bst的层序遍历序列#include <iostream>#include <cstdio>#include <algorithm>#include <queue>using namespace std;struct node{//二叉树的静态写法 .原创 2020-10-16 16:53:46 · 136 阅读 · 0 评论 -
|CBT|1064 Complete Binary Search Tree (30分)???用数组存储_数组下标(1)就是节点编号_数组元素的值就是节点点权
https://blog.csdn.net/sinat_41144773/article/details/89530403转载 2020-10-16 09:37:12 · 131 阅读 · 0 评论