
数据结构
PDYJ
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
|DS线性表的顺序存储_顺序表|静态数组&动态分配
线性表的基本操作:InitList(&L):初始化表,构造1个空的线性表ListInsert(&L,i,e):插入操作,在表L的第i个位置插入指定元素eListDelete(&L,i,&e):删除操作,删除表中第i个位置的元素,并用e返回删除元素的值GetElem(L,i):按位查找操作,获取表中第i个位置上的元素的值LocateElem(L,e):安置查找操作,在表L中查找具有给定关键字值得元素PrintList(L):输出操作,按前后顺序输出线性表L的所有元.原创 2021-03-16 16:29:29 · 582 阅读 · 0 评论 -
Dijkstra多重筛选条件模板(点权具体分析_边权_条数_多条==<>_结构体排序)
|Dijkstra + 多重条件判断(点权)+map映射+dfs打印路径|L3-011 直捣黄龙1030 Travel Plan (30分)//求:起点到终点的最短路径,最短距离,以及花费//如果有多条最短路径,则选择花费最小的那条1003 Emergency (25分)现在给出起点和终点,求从起点到终点的最短路径条数以及最短路径上的救援小组数目之和。如果有多条最短路径,则输出数目之和最大的----------点权和L3-005 垃圾箱分布 (30分)//最短距离最长//输出到所有居民点原创 2020-11-14 09:16:34 · 266 阅读 · 0 评论 -
|Dijkstra + 多重条件判断(点权)+map映射+dfs打印路径|L3-011 直捣黄龙
refer题意:找到己方大本营到敌方大本营的一条最短路径,当这样的路径有多条时选择解放最多城镇的路径 (就是经过的城市越多越好),当这样的路径也有多条时选择杀敌数最多的路。方法:Dijkstra (模板)+ 多重条件判断。数据处理:用map容器对表示城市的字符串做数据映射,使得城市可以用0到N-1表示,方便建立邻接矩阵,然后套上最短路径模板 + 三个条件判断。题目要求求己方大本营PAT到达敌方大本营DBY的最短路径且满足3个条件。根据图中可知,最短路径为30,且这样的路径有3条:(第原创 2020-11-14 08:10:35 · 450 阅读 · 0 评论 -
|stoi+Dijkstra+结构体排序|L3-005. 垃圾箱分布 - Dijkastra模板题 -天梯赛练习
referreferlink原创 2020-11-11 22:11:34 · 131 阅读 · 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 · 383 阅读 · 0 评论 -
多条最短路径_边权_点权_数目_模板
从起点到终点的距离的最短距离最小的路径不止一条,于是给定起点和终点,有2种及以上的最短距离的路径,那么题目会这么问:1.每条边再增加1个边权(比如花费),然后在最短路径有多条时,求路径上的花费之和最小2.给每个点增加1个点权(每个城市能收集到的物资),然后在最短路径有多条时,求路径上收集的物资之和最多3.直接问有多少条最短路径我们只需要再增加1个数组来存放新增的边权或点权或者最短路径条数然后只需要在Dijkstra算法中修改d[v]的那个步骤即可1.新增边权边权—>花费最短原创 2020-11-09 11:04:27 · 912 阅读 · 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 · 212 阅读 · 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 · 205 阅读 · 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 · 131 阅读 · 0 评论 -
1154 Vertex Coloring (25 分)ing。。。。。
refer原创 2020-11-07 20:49:46 · 107 阅读 · 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 · 111 阅读 · 0 评论 -
树的静态写法_总结_模板(ing.............
111111原创 2020-11-05 14:32:01 · 331 阅读 · 0 评论 -
图dfs--不是算法
邻接矩阵存储图信息深度遍历的图!!!邻接表存储图信息原创 2020-10-31 11:09:11 · 103 阅读 · 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 · 199 阅读 · 0 评论 -
|邻接表bfs遍历图|1076 Forwards on Weibo (30分)
//在微博,当用户发布一条信息时//他的关注者可以看到这条信息并且选择是否转发它//且转发的信息可以被被转发者的关注者再次转发//但是同一用户最多只能转发该信息一次(信息的最初发布者不能转发该信息)//现在给出N个用户的关注情况(即他们各自关注了哪些用户)//以及一个转发层数的上限L-----------高度//并给出最初发布消息的用户编号,球在转发层数上限内最多会被多少用户转发//咋觉得是求节点数目呢?//7 3 n用户个数 l转发层数上限//接下来n行(顶点编号1~n)//M.原创 2020-10-31 20:54:43 · 128 阅读 · 0 评论 -
|不懂|1021 Deepest Root (25 分)--PAT甲级
题目大意:找到使一棵树深度最大的所有根节点,若不为树,则输出连通分量个数。先一遍dfs得到深度最大的所有点的集合,再从集合中随便找一个节点,从该点出发再做一遍dfs,得到另一个深度最大的所有点的集合,两个集合的并集即为结果。也可以直接暴力法:对每个节点做一遍dfs,将得到的深度最大的节点记录下来。暴力:#include<iostream>#include<cstdio>#include<cstring>#include<cmath>.原创 2020-10-31 11:12:10 · 113 阅读 · 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 · 522 阅读 · 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 · 197 阅读 · 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 · 131 阅读 · 0 评论 -
树和图的区别、联系(树是有向无环的特殊的图)
树是图(树是图的子集),图不一定是树树有一个根节点,图没有树可以递归遍历,图要看情况树有层次划分,图没有树是一种“层次”关系,图是“网络”关系线性表中数据元素仅有线性关系,树则具有明显的层次性,而图的复杂性要远远超过线性表和树.在图中结点之间的关系是任意的,任何两个结点都可能相关,因此图能用来解决现实世界中一些极其复杂问题.例 (Example)Tree:树:Graph:图形:树数据结构树,和图一样也是一系列点的集合。有一个根节点。这个根节点有一些子节点.原创 2020-10-29 09:28:03 · 26842 阅读 · 5 评论 -
dfs遍历图
dfs是以深度为第一关键词每次都沿着路径到不能再前进时才退回到最近的岔道口沿着一条路径直到无法继续前进才退回到路径上里当前顶点最近的&还存在未访问的岔道口并前往访问那些未访问的分支顶点直到遍历完这个图dfs的具体实现2个概念:1)连通分量:2个顶点联通:2个顶点之间可以互相到达(无向图中)====》联通图:图G(V,E)的任意2个顶点都联通(无向图)连通图的连通分量一个,但是非联通图的联通分量有多个连通分量:极大的联通子图link求图的连通分量的目的,原创 2020-10-29 08:48:53 · 1968 阅读 · 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 · 177 阅读 · 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 · 178 阅读 · 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 · 155 阅读 · 1 评论 -
|每删一个节点计算块数,判断连通性|L2-013 红色警报 (25 分)
天梯 并查集link【解题思路】每一次都要重新判断一下需要连接的道路变化有无影响有影响的情况比较难找,那就直接先判断没有影响的情况就是等于前集合数目等于现集合数目或原集合数目+1等于现集合数目(因为题意,若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报)这样即使去掉当前结点也无碍如果连通块数组不变或者减1(原来就是孤立得一个),说明图连通块数目不受影响如果连通块数目增加了1,则说明连通块加1,图中连通性受到影响//输入//第一行 n,m原创 2020-10-26 17:34:29 · 444 阅读 · 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 · 115 阅读 · 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 · 642 阅读 · 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 · 484 阅读 · 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 · 414 阅读 · 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 · 165 阅读 · 0 评论 -
树节点的高度
https://blog.csdn.net/qq_36667170/article/details/84142019原创 2020-10-25 15:39:24 · 513 阅读 · 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 · 137 阅读 · 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 · 261 阅读 · 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 · 176 阅读 · 0 评论 -
|CBT|1064 Complete Binary Search Tree (30分)???用数组存储_数组下标(1)就是节点编号_数组元素的值就是节点点权
https://blog.csdn.net/sinat_41144773/article/details/89530403转载 2020-10-16 09:37:12 · 172 阅读 · 0 评论 -
1043 Is It a Binary Search Tree (25分)
void insert(node* &root,int data){}----------insert(root,tmp);void postMirrorOrder(node* root,vector &v){}----preMirrorOrder(root,preM);if(origin==pre){}-----------vector可以比较`// 7// 8 6 5 7 10 8 11#include <iostream>#include <cs...原创 2020-10-15 14:58:39 · 120 阅读 · 0 评论 -
|给出路径长度(点权和)求|1053 Path of Equal Weight (30分)*********
1053 Path of Equal Weight (30分)//给定一棵树和每个节点的权值//求所有从根节点到叶子节点的路径//使得每条路径上的节点的权值之和等于给定的常数S//如果有多条这样的路径//按照路径非递增的顺序输出//其中路径的大小是指,如果有两条路径分别为a1->a2->...ai->an和b1->b2->b3->...bi->bm//如果ak>bk,则称第一条路径大------>递减,编号大的先输出#include &原创 2020-10-14 16:51:53 · 134 阅读 · 0 评论 -
|树的每一层叶子节点的个数|1004 Counting Leaves (30分)
求每一层的叶子节点数注意点:1.到底有几层?所以用了maxDepth来保存最深的层数便于后续来输出每层的层数2.如何保存每层的层数HashTable[]散列表来存储,下标是层数,元素是叶子个数#include <iostream>#include <cstdio>#include <vector>using namespace std;int n,m,maxDepth=0;int hashTable[110]={0};vector<int&原创 2020-10-14 15:41:50 · 376 阅读 · 0 评论 -
|最低层次叶子节点价格,个数|1106 Lowest Price in Supply Chain (25分)1090 Highest Price in Supply Chain (25分)
void dfs(int index,int depth){ if(child[index].size()==0){//没有孩子,到达根节点了 if(depth>maxDepth){ maxDepth=depth; num=1; }else if(depth==maxDepth){ num++; } return; }void dfs(int in原创 2020-10-14 14:50:22 · 107 阅读 · 0 评论 -
|树某层最多节点数,层号|1094 The Largest Generation (25分)1090 Highest Price in Supply Chain (25分)
树的静态写法,也就是我们一直碰到的的vector<int>Node[max]虽然之前有碰到过int lchild,rchild;但是鉴于前者练习次数过多,用来比较顺手,并且也可以适用于除了二叉树的树所以以后如果题目就是编号 01234…给出它们的孩子,就用前者了vector<int>Node[max]如果是有点权 的话,那就用结构体吧,把vector<int>Node[max]改写为vector<int>child,然后在定义结构体数组Node[max原创 2020-10-14 11:54:31 · 132 阅读 · 0 评论