![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构算法
JamSlade
这个作者很懒,什么都没留下…
展开
-
数据结构算法——1106. 链表去重插入排序
题目思路善用stable_sort然后开一个新的vector去重别忘记改指针代码#include<vector>#include<algorithm>#include<iostream>using namespace std;// typedef struct node {// int data;// struct node* next;// // 其他数据域成员// }NODE;bool cmp(NODE*原创 2021-12-23 14:50:14 · 707 阅读 · 0 评论 -
数据结构算法——1102. 任务调度问题
题目思路拓扑排序问题用队列进行储存把入度为0的点先存进去然后利用vector来储存每个点对应的后置课程(出度并用一个数组记录每个课程的前置课程数量在出栈的时候把该前置课程对应的后置课程数组储存的数字-1(也就是入度-1)在这个过程中数组储存的数变成0的话,入栈,如此往复代码#include<iostream>#include<vector>#include<queue>using namespace std;vector<int>原创 2021-12-23 14:24:15 · 1561 阅读 · 1 评论 -
数据结构算法——1097. Hub Connection plan
题目Partychen担任系统管理员,并计划在他的公司建立一个新的网络。该公司将有N个集线器,它们可以通过电缆相互连接。由于公司的每个员工都必须能够访问整个网络,因此每个集线器必须可以通过任何其他集线器(可能有一些中间集线器)的电缆访问。由于可以使用不同类型的电缆,且较短的电缆更便宜,因此有必要制定这样的集线器连接计划,以使成本最低。partychen将为您提供有关可能的集线器连接的所有必要信息。您将帮助partychen找到连接集线器的方法,以便满足上述所有条件。输入格式输入的第一行包含两个整数:原创 2021-12-23 10:29:55 · 539 阅读 · 0 评论 -
数据结构算法——1096. Building Roads
题目第一行第一个数字N N个点第一行第二个数字M 已链接M条路下面N行,N个点的坐标下面M行,链接路的两个点找出损耗最小的生成树(已经连接的路不必再连接输入4 11 13 12 34 31 4输出4.00思路并查集。。先把所有连接好的并一起,之后sort一下顺寻,继续并查集代码#include<iostream>#include<vector>#include<algorithm>#include<cmath>us原创 2021-12-23 10:05:09 · 178 阅读 · 0 评论 -
数据结构算法——1095. 公路村村通
题目输入6 151 2 51 3 31 4 71 5 41 6 22 3 42 4 62 5 22 6 63 4 63 5 13 6 14 5 104 6 85 6 3输出12思路经典并查集,生成最小生成树代码#include<iostream>#include<vector>#include<algorithm>using namespace std;struct node{ int start, en原创 2021-12-23 09:36:03 · 1128 阅读 · 0 评论 -
数据结构算法——1093. 哈利·波特的考试
题目输入6 113 4 701 2 15 4 502 6 505 6 601 3 704 6 603 6 805 1 1002 4 605 2 80输出4 70思路floyd算法二重循环然后再把矩阵中每一行的最大值取出来——从起始到这个点必定经过所有点若干个每一行最大值的最小值就是需要的最小值动物(注意这是有向图,所以不能用对称矩阵代码#include<iostream>#include<cstring>using namespac原创 2021-12-22 12:06:58 · 359 阅读 · 0 评论 -
数据结构算法——1091. 六度空间
题目输入10 91 22 33 44 55 66 77 88 99 10输出1: 70.00%2: 80.00%3: 90.00%4: 100.00%5: 100.00%6: 100.00%7: 100.00%8: 90.00%9: 80.00%10: 70.00%思路BFS应该没啥大问题,利用queue存放pair<int,int>就可以注意使用BFS时候的mark数组记录是否便利某一个点的问题代码#include<iostream原创 2021-12-22 10:32:57 · 1111 阅读 · 0 评论 -
数据结构算法——1089. 路由器
题目输入4 5168.120.1.1 168.120.1.2 15168.120.1.1 168.120.1.4 47168.120.1.1 168.120.1.3 10168.120.1.2 168.120.1.4 15168.120.1.3 168.120.1.4 253168.120.1.1 168.120.1.4168.120.1.3 168.120.1.4168.120.1.3 202.12.12.12输出3025-1思路这个数据量用floyd算法绰绰有余由于原创 2021-12-22 09:52:43 · 583 阅读 · 0 评论 -
数据结构算法——1088. 最短路径
题目思路dijkstra比较好,通过BFS来不断寻找到n这条路径需要用road列表(path) 记录前一个点以及 dist列表来记录第一个点到第i个点的距离由于题目要求问多个最短路径,所以还得需要一个count数组来记录到这个路的最短路径到底有多少条dijkstra就是先把数据都存放在邻接表上面然后初始化dist列表,除了自己到自己以外,其他所有的路径初始为INF(无法到达)然后把自己存入队列{0,1} 0代表距离,1代表去自己本身。接着根据邻接表依次拿出1结点邻接的点,判断是否来过这个点原创 2021-12-22 09:12:37 · 1201 阅读 · 0 评论 -
数据结构算法——1087. 地下迷宫探索
题目输入6 8 11 22 33 44 55 66 43 61 5输出1 2 3 4 5 6 5 4 3 2 1思路为了保证输出从小到大,不妨使用set作为存放edge的容器为了保证路可以回去,可以利用栈(递归)来进行道路的存放DFS的过程中倘若未经过该点就存放该点在道路中,然后继续探索下一个连通的未经过的最小点,返回的时候如果确实经过该点了(返回1)就存放回来时候该点的数据代码#include<iostream>#include<set>#原创 2021-12-21 19:04:26 · 556 阅读 · 0 评论 -
数据结构算法——1086. 哥尼斯堡的七桥问题
题目思路判定欧拉图所有的点度为偶数且连通分量为1,判定连通分量用DFS(BFS也可代码#include<iostream>#include<vector>using namespace std;#include<cstring>int dot[2000];int mark[2000];vector<int>edge[2000];void dfs(int x){ if(mark[x]) return; mark[x原创 2021-12-21 18:17:57 · 790 阅读 · 0 评论 -
数据结构算法——1085.卫星照片
题目输入10 5..*.....**.**..*****.*...*......****.***..****.***输出16思路可以用dfs也可以用bfs,后面再补一下bfs的操作还有就是出现换行符和空格的时候要想清楚输入问题。。。代码DFS#include<iostream>#include<cstring>using namespace std;pair<int,int>dir[4] ={ {1,0},{-1,0},原创 2021-12-21 17:44:28 · 276 阅读 · 0 评论 -
数据结构算法——1084. 食物链
题目输入100 71 101 12 1 22 2 32 3 31 1 32 3 11 5 5输出3思路参考前一题1083. 小强的烦恼这里的区别是tag多加了一种状态在mod3下的x的tag后继数(0后继为1,1后继为2,2后继为3)说明y是x的食物链上层代码#include<iostream>#include<map>using namespace std;struct dot{ int father; int tag;原创 2021-12-21 15:26:14 · 487 阅读 · 0 评论 -
数据结构算法——1083. 小强的烦恼
题目数据16 9Q 1 2A 1 2Q 1 2A 3 4Q 1 3A 5 6A 4 5Q 3 6Q 4 6输出Not sure yet.In different gangs.Not sure yet.In different gangs.In the same gang.思路详见注释代码#include<iostream>#include<map>using namespace std;struct dot{ int fa原创 2021-12-21 14:42:18 · 378 阅读 · 0 评论 -
数据结构算法——1081. 朋友圈
题目思路并查集,输入n和m然后m个俱乐部里面取第一个人进行朋友圈交涉,让其余的人都纳入第一个人的集合中father[find(a)] = find(b) //b的祖先是a的在祖先处理完所有人的关系后再对齐进行计数代码#include<map>#include<iostream>using namespace std;map<int, int>father;map<int,int> count;int find(int& s)原创 2021-12-21 12:22:15 · 611 阅读 · 0 评论 -
数据结构算法——1082. Virtual Friends
题目现在,你可以在网上做各种事情。例如,您可以使用各种网站来结交虚拟朋友。对一些人来说,发展他们的社交网络(他们的朋友、他们朋友的朋友、他们朋友的朋友的朋友等等)已经成为一种上瘾的嗜好。就像有些人收集邮票一样,其他人收集虚拟朋友。你的任务是观察这样一个网站上的互动,并跟踪每个人的网络规模。假设每一种友谊都是相互的。如果弗雷德是巴尼的朋友,那么巴尼也是弗雷德的朋友。输入格式输入的第一行包含一个整数F,指定要遵循的测试用例数。每个测试用例都从一行开始,其中包含一个整数,即形成的友谊数F,不超过100原创 2021-12-21 11:45:41 · 347 阅读 · 0 评论 -
数据结构算法——1078.Huffman树的最小外部加权值
题目思路霍夫曼树。。这里用set或者priority_queue实现都可代码#include<iostream>#include<set>using namespace std;int main(){ int n; cin >> n; multiset<int>s; for(int i = 0; i < n; i++) { int data; cin >&原创 2021-12-24 16:20:47 · 495 阅读 · 0 评论 -
数据结构算法——1076. 树种统计
题目输入29Red AlderAshAspenBasswoodAshBeechYellow BirchAshCherryCottonwoodAshCypressRed ElmGumHackberryWhite OakHickoryPecanHard MapleWhite OakSoft MapleRed OakRed OakWhite OakPoplanSassafrasSycamoreBlack WalnutWillow输出Ash 13.原创 2021-12-08 19:18:56 · 673 阅读 · 0 评论 -
数据结构算法——1074. 寻找EMB富豪
题目思路注意数据过大,用scanf进行输入正常的堆排序分两步进行循环:形成大根堆void build_heap(int size) { for (int i = size / 2 - 1; i >= 0; i--) { // 倒数第二排开始, 创建大顶堆,必须从下往上比较 down(i, size); // 否则有的不符合大顶堆定义 } } 最后一个节点和第一原创 2021-12-06 11:46:10 · 444 阅读 · 0 评论 -
数据结构算法——1072. 二叉搜索树
题目思路由于二叉搜索树的特性,不难发现,插入的时候,比节点小插左边,反之插右边即可代码#include<iostream>using namespace std;struct dot{ int data; dot* lc = NULL; dot* rc = NULL; void post_print() { if(!this) return; if(this->lc) th原创 2021-12-06 11:39:43 · 919 阅读 · 0 评论 -
数据结构算法——1071. 平衡二叉树
题目思路AVL树的实现,先用一下网上别人的代码,后续再自己完善代码#include<iostream>#include<algorithm>#include<queue>using namespace std; template <typename keyType>//之后的类名一定要记得加上<typename> class BinaryTreeNode{public: keyType value; BinaryTree原创 2021-12-06 11:37:16 · 166 阅读 · 0 评论 -
数据结构算法——1070. 下落的小球
题目输入54 23 410 12 28 128思路因为这个树是满二叉树并且不会删除插入,我们使用顺序存储结构来储存这个数,这样子 结点的左孩子就是对应结点下标index的两倍,右孩子就是对应下标两倍+1即 2 * index + 1每次访问的时候改一下他的bool值即可代码#include<bits/stdc++.h>using namespace std;struct dot{ bool dir = false;};int power(int p,原创 2021-11-22 13:59:04 · 956 阅读 · 0 评论 -
数据结构算法——1069. 二叉树路径和(先占个坑 后面再处理输入问题
题目思路其实思路和1068差不多就是输入太恶心了,后面有时间再补充原创 2021-11-22 13:54:18 · 130 阅读 · 0 评论 -
数据结构算法——1068. 最小权值路径
题目思路和前面的还原二叉树一样然后遍历第一个符合的路径即可代码#include<iostream>#include<stack>#include<sstream>using namespace std;int min_road = 9999999;int min_leaf = 9999999;struct dot{ int data = -1; dot* lchild = NULL; dot* rchild = NUL原创 2021-11-22 13:51:29 · 830 阅读 · 0 评论 -
数据结构算法——1067. 目录树
题目input:7bcab\cda\bcab\da\d\aa\d\z\思路善用STL代码#include<bits/stdc++.h>using namespace std;struct folder{ string name; map<string,folder*> folder_child; set<string> file_child;};void print(const folder* root,原创 2021-11-09 15:18:27 · 865 阅读 · 0 评论 -
数据结构算法——1066. 还原二叉树
题目思路前序遍历是先输出根节点,然后左节点,右节点也就是说,第一个节点必定是根节点,后序会把左子树的点输出完再输出右子树后序遍历是先输出完左子树的节点,输出根基点,再输出右节点所以我们先在先序遍历这里确定根基点然后在中序遍历中找到A的位置,于是我们可以确定A的左边全都是左子树节点,A的右边全都是右子树节点由于是同一颗树,左数节点+根节点的数量应该是一样的中序遍历的右边就是右子树,而前序遍历将指向A的节点指向E后面(刚好对应中序遍历A的上方)开始递归创建右子树而左子树就是从画橙圈的部分继原创 2021-11-09 14:12:31 · 830 阅读 · 0 评论 -
数据结构算法——1065. 树的相关操作
题目输入1 -12 13 24 35 46 57 58 69 710 711 812 913 914 1015 10输出思路可以尝试一下编写前后层序遍历的迭代形式前序:①根进stack②当stack不为空 [while(!s.empty())]③.1 temp = stack.pop③.2 判断 temp是否有右节点③.2.1有:全部存放进去(由于stack的特性,从右向左入栈)③.2.2 没有:啥也不做④输出temp的数据data层序:可以用队原创 2021-11-03 12:53:46 · 280 阅读 · 0 评论 -
数据结构算法——1064. 树的层号表示法
题目思路熟悉好后序遍历的输出即可代码#include<iostream>using namespace std;struct dot{ char data; dot* parent; dot** child; int child_num; dot() { data = 0; parent = NULL; child = new dot*[26]; child_num =原创 2021-11-01 19:02:14 · 733 阅读 · 0 评论 -
数据结构算法——1063. 树的双亲存储法
题目思路把这个顺序储存变成链式储存再进行后序遍历(先左子树,然后右子树,再根节点)前中后遍历介绍代码#include<bits\stdc++.h>using namespace std;int Count = 0;void Postorder(int n, vector<int>* tree){ for(int i = 0; i < tree[n].size(); i++) { Postorder(tree[n][i], t原创 2021-10-30 09:47:10 · 390 阅读 · 3 评论 -
数据结构算法——1055. 快速排序的优化
题目思路当给一个基本逆序,或者基本有序的数组中,快速排序会退化成选择排序所以我们除了题目提示给的思路之外还可以先把各个小的部分(比如每个部分只有50个元素)进行插入排序,让整个数组不那么逆序再进行快排操作,可以大大缩减快排(避免退化成选择排序)的操作时间代码#include<iostream>using namespace std;void choosesort(int* arr, int left, int right){ for(int i = left; i原创 2021-10-24 13:13:14 · 2734 阅读 · 0 评论 -
数据结构算法——1054. 快速排序
题目思路打卡题需要注意的是,,这个题目在左右平移的时候 相等的情况都是要继续移动的代码#include<iostream>using namespace std;void quicksort(int* arr, int left, int right, int n){ if(left < right) { int l = left, r = right, compare = arr[left]; while(l原创 2021-10-23 15:47:01 · 186 阅读 · 0 评论 -
数据结构算法——1049. 三元组稀疏矩阵相加
题目思路真绷不住了 一开始用课本的十字链表超时,拿STLmap来储存超时,然后再试把所有数据先记录下来排序顺序输出也超时。我估计只有基数排序才能不超时了。后续学了树再慢慢思考这题吧,本菜鸡学业不精拉跨的代码课本的十字表#include<iostream>using namespace std;struct node{ int row,col,val; node *right, *down; node() { right = d原创 2021-10-23 15:44:34 · 1976 阅读 · 0 评论 -
数据结构算法——1048.稀疏矩阵三元组转化
题目思路这里直接把x和y换一下输入然后排序就完事了。。代码#include<bits/stdc++.h>#include<algorithm>using namespace std;struct ele{ int x; int y; int d;};bool cmp(ele a, ele b){ if(a.x == b.x) return (a.y < b.y); return(a.x <原创 2021-10-23 14:18:05 · 259 阅读 · 0 评论 -
数据结构算法——1047. 密码碰撞
题目in5mirmirtatairtout6思路把每一个输入的字符串的所有子串都++(此时需要用set来避免子串重复++,并且要用hash来记录所有子串对应的数量)最后,把每一行“输入的”字符串对应的数字-1都加起来(对应的数字 代表着 有多少个主串的子串包含了这个输入的字符串,但是你得去掉自己匹配自己的情况)由于懒就用STL的set和map了代码#include<bits/stdc++.h>using namespace std;int main(){原创 2021-10-16 10:46:21 · 355 阅读 · 0 评论 -
数据结构算法——1045. 口令
题目思路把输入的字符串quiz过一遍,用数组记录每个字符出现的频次然后如果遇见了quiz和guess字符串都相同的字符,对应的频次-1,match++后续再过quiz,如果数组频次不为0且quiz[i] != guess[i],unmatch++代码#include<iostream>#include<cstring>using namespace std;int alpha[128];int occur[128];int main(){ strin原创 2021-10-16 09:32:36 · 142 阅读 · 0 评论 -
数据结构算法——1043. 字符串模式匹配BM算法
题目思路检验26个字母(可以把标点符号和数字也加上)在短串的位置 (自右向左):有如下情况①字母不在短串中 || 字母是短串的最后一个位置 : 往右移动s.length()②字母在短串中且不是最后一个位置 往右移动 s.length() - i - 1 (这的i是字母在子串中出现的最大位置)比如return这个子串,r出现在0位和4位,取4于是 f(n) = 6, f( r ) = 4, f(u) = 3 f(t) = 2 f(e) = 1,其他所有字母 = 6当你不匹配的时候,匹配的子串原创 2021-10-15 15:18:39 · 314 阅读 · 0 评论 -
数据结构算法——1042. 字符串模式匹配KMP算法
题目思路把next数组求出来举个例子![在这里插入图片描述](https://img-blog.csdnimg.cn/5c94e122d0384afaaa021e1ff505e7da.png当我们程序在判断2字符串最后一个a和1字符串的子串不匹配的时候,我们其实根本没必要再去判断中间的a是否需要我们直接把后续整个部分都移动到a后面即可,那么问题来了,移动几个a呢?在这个题目中,应该是移动成这种情况将第一个a放到不匹配的区域(如果不理解再举个例子这里不匹配的是a和f,那么我们应该找8字原创 2021-10-10 14:02:44 · 234 阅读 · 0 评论 -
数据结构算法——1040. 最长回文子串
题目思路最朴实无华的就是两个嵌套循环遍历所有的子串,然后再一个循环判定是否为回文,On³的复杂度然而判定回文的时候,可以从子串出发:若这个串去掉头尾的时候不是回文串,那么这个串一定不是回文串。那么我们只需要从回文串增加头尾再判定即可(只判定头尾是否相等所以有两种,一种是偶数串,一种奇数串,分别判定一遍即可代码#include<iostream>#include<string.h>using namespace std;int palindrome(strin原创 2021-10-10 10:59:01 · 268 阅读 · 0 评论 -
数据结构算法——1039. 最长连续公共子序列
题目思路假定A的i-1和B的j-1的数据并不相同,比较A的i位置和B的j位置要从0开始累加若A的i位置和B的j位置相同,那么在比较A的i+1位置和B的j+1位置时候,就要从1开始累加于是我们不难得出dp条件array[i+1][j+1]=array[i][j]+1A[i]==B[i]array[i+1][j+1]=array[i][j] + 1\quad A[i]==B[i]\\ array[i+1][j+1]=array[i][j]+1A[i]==B[i]其他情况array[i+1][j+1原创 2021-10-10 10:29:34 · 311 阅读 · 0 评论 -
数据结构算法——1036. 字符串替换
题目思路BF算法找到匹配的子串注意点① 替换子串需要把后续部分移动,右移和左移不一样注意点② 替换完字串后,i要+=替换字串长度,s的长度也要更新代码#include<stdio.h>#include<iostream> using namespace std;#define N 80#include<string.h>void replace(char s[], char x[], char y[]) { //TODO: your funct原创 2021-10-07 20:38:23 · 941 阅读 · 0 评论