自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 超详细C转C++简单教程(算法竞赛所需)

说实话,用c语言来写算法竞赛(蓝桥杯,acm)也是完全没有问题的,说是转型c++,其实并不是,只是借助了c++的一些STL容器(听起来很高级,其实就是栈,队列啥的)和一些库函数,例如sort函数,比快速排序啥的都要快,c++只需要一行就搞定了,不用再像c语言一样写很多,并不是真正的转型,也没必要担心自己学不会,还是c语言那老一套,只不过scanf printf换成cin cout等等。不过,用c++来写,确实省时省劲,还是很值得去学的!有很多教程和视频都做得十分晦涩难懂,生怕你学会了…所以我今天来做个简单

2022-01-18 17:48:19 19540 28

原创 c++结构体排序

【代码】c++结构体排序。

2023-06-05 09:05:09 197

原创 C++图的最小生成树之prim算法

首先看一个无向图求其最短路径,可以换一种思路。若是要求最短路径,那每一点必须包含在内,并且,路一共要有n-1条,就可以联想到,是不是可以用点来找最短路,即每个点都找一条“权值最小,并且这条出边的末端还未被找到“的出边。和dijkstra很像,也是要dis数组来记录,不同的是判断条件为dis[j]>a[q][j]而不是dis[j]>dis[k]+e[k][j],因为只需要看 没找过的点 离哪个 已找过的点 最近。例如点1到点2后,点2有2->3,2->6两条出边,2-&gt

2022-02-19 23:31:43 880

原创 C/C++图的最小生成树

先看一下这个带权值的无向图现在要求用最少的边(权值和)让整个图连通,也就是任意两点都可互相访问到,因为不包含回路的连通无向图就是一棵树,所以就是来求最小生成树。一提到求最小,我们很容易就想起了贪心算法,就是先把各边的按权值从小到大排列,然后每次只要最小的,最后就能保证结果就是最小的。但是约束条件是什么呢?比如如何判断最后是否是个连通图,如何判断两点连通,这时候就要知道两个很重要的特性:1.n个顶点的连通图,至少要n-1条边!!!所以最小连通图为n-1条边2.2个点连通,则其为同一祖先判断是否同

2022-02-06 23:17:21 839

原创 C/C++ 并查集

并查集作用及其原理如下靠左原则就是 在两个点有联系的时候,让左边的点当爹,右边当儿子(其实靠右原则也是完全可以的)。擒贼先擒王原则就是,要让某一点认另一点当爹的时候,直接让这一点的爹认另一点当爹,例如点6认点1当爹,但是点6的爹是点3,点3的爹是自己(即点3为根结点)这时候直接让点3认点1做爹就行了。可以用并查集来找出独立集合,即祖先不同的点的集合int seek(int x)//找祖先和路径压缩的函数{ if(a[x]==x) return x; else { a[x]=seek(a

2022-02-01 01:05:42 706

原创 C++基于最大堆的堆排序

和基于最小堆的堆排序差别不大,siftdown函数稍作改动,把popmin函数换成了heapsort函数#include <iostream>#include <bits/stdc++.h>using namespace std;int h[100],n;void swap(int x,int y){ h[x]=h[x]+h[y]; h[y]=h[x]-h[y]; h[x]=h[x]-h[y]; return;}void siftdown(int i){

2022-01-21 17:11:28 261

原创 C++树&二叉树&堆&基于最小堆的堆排序

先看一下树和二叉树树这就是一棵树,最上面那个是祖先,叫根结点,在上面的是父结点,下面的是子结点,最下面的那排没儿子了,所以叫叶结点,根结点和叶结点中间那些就叫内部结点。根结点深度为1,然后依次类推,在第几层深度就是几。很明显,树不包含回路。二叉树二叉树就是每个结点最多有俩儿子–左儿子和右儿子。二叉树有俩特殊的情况,满二叉树和完全二叉树,满二叉树就是内部结点都有俩儿子,很饱满。完全二叉树就是叶结点从右向左缺了几个(因为必须有左儿,要不就没儿,不能光一个右儿)如图,就是一颗完全二叉树完全二叉

2022-01-21 16:40:54 719

原创 C++队列优化的bellman算法

普通的bellman算法如下 for(int i=1;i<=n-1;i++) { for(int j=1;j<=m;j++) { if(dis[v[j]]>dis[u[j]]+w[j]) { dis[v[j]]=dis[u[j]]+w[j]; } } }此处需进行n-1次循环来判断是否已经达到最短路径,但其实有些点在n-1之前已经求得最短路径了,所以采用队列+邻接表来进行优化,把一个顶点的所有出边全都处理完了,然后把这个点出队即可。因为不会

2022-01-15 23:50:54 219

原创 C++bellman算法

与dijkstra算法不同的是,bellman算法是直接用边来松弛,而dijkstra算法是找离定点最近的点来进行松弛//核心代码如下 for(int i=1;i<=n-1;i++) { for(int j=1;j<=m;j++) { if(dis[v[j]]>dis[u[j]]+w[j])//同样也是用dis数组来记录最短路径 { dis[v[j]]=dis[u[j]]+w[j]; } } }完整代码如下#include <ios

2022-01-15 14:44:18 303

原创 C++邻接表(利用数组实现)

邻接表用来储存稀疏图很好(图为G<V,E>,若E<<V²,即边数小,则称为稀疏图),下面解释一下啊哈算法上关于邻接表的代码,有点绕。首先需要2个数组,first[]和next[],first的作用是找某一点的第一条边(其实最后遍历邻接表是以读入的反方向来遍历的,比如1顶点的2条出边 1 4 9和1 2 5,输入顺序是1 4 9先,1 2 5 后,但遍历是先遍历1 2 5,再遍历1 4 9,所以这里用“某一点的第一条边”来解释也不太好,只能说能在first开始,找到所有边…),nex

2022-01-15 01:34:44 1151 1

原创 C++ Dijkstra算法(单源最短路径)

如图,共有6个城市9个公路,希望知道点1到其余各个顶点的最短距离(单源最短路径)首先就得把这一大堆路线转换成一个表,二维数组即可例如第一行第二列的1就表示从1到2的距离为1,无穷则表示没路,不能直接到达,(1,1),(2,2)等对角线均为0,当然就是自己到自己的距离为0啦…具体构建图的过程如下cin>>n>>m;//n个点,m条边 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j)

2022-01-09 19:58:55 1217

原创 C++ 弗洛伊德算法(多源最短路径)

如图,共有4个城市8个公路,希望知道任意两点间的最短距离(多元最短路径)首先就得把这一大堆路线转换成一个表,二维数组即可例如第一行第二列的2就表示从1到2的距离为2,无穷则表示没路,不能直接到达,(1,1),(2,2)等对角线均为0,当然就是自己到自己的距离为0啦…具体构建图的过程如下cin>>n>>m;//n个点,m条边 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) a[i

2022-01-09 19:45:30 849

原创 C++ bfs 迷宫问题

输入一个二维数组表示迷宫,然后输入起始位置和要找到的位置,求其最短路径地图样例5 40 0 1 00 0 0 00 0 1 00 1 0 00 0 0 11 1 4 3和dfs不同,bfs是基于队列实现的,每次把同一层次的搜完,然后再搜下一层的所有数,而不是一条路走到黑,迷宫问题bfs是优于dfs的,因为bfs只要首次找到终点,那路径必是最短路径,不用再像dfs一样全遍历完再比较。其具体路径如下首先先建个结构体,用来储存每一步的x,y和步数struct node{ int x;

2022-01-09 10:02:03 759

原创 C/C++实现dfs(迷宫问题 最短路径)超级详细

C/C++实现dfs(迷宫问题 最短路径)超级详细

2022-01-02 20:16:24 9063 1

原创 C/C++实现dfs(数的全排列)

从 1 2 3到1 3 2的过程#include <iostream>#include <bits/stdc++.h>using namespace std;int n,a[100],b[100];void dfs(int x){ if(x==n+1) { for(int i=1;i<=n;i++) { cout<<a[i]<<" "; } cout<<endl; return; } for(i.

2021-12-31 23:36:30 803

原创 C/C++快速排序

二分思想+递归#include <iostream>#include <bits/stdc++.h>using namespace std;int a[100000],n;void min_qsort (int x,int y)//从小到大 { int t,i=x,j=y; int sb=a[x]; if(x>y) return;//边界,必写 while(i!=j) { while(sb<=a[j]&&i<j) j--;

2021-12-31 00:31:07 434

原创 c++ 实现回文

```cpp#include <iostream> #include <bits/stdc++.h>using namespace std;int main(){ int mid,i; string s1; stack <char>s2; cin>>s1; int l=s1.size(); if(l%2==0) mid=l/2; else mid=l/2+1; string s=s1.substr(mid); cout<&l.

2021-12-25 20:50:22 630

原创 C语言 指针理解

#include <stdio.h>void g(int a){ a=1;}void f(int *a) { *a = 1; }int main(){ int b = 5; int* c; c = &b; printf("c地址: %d\n",c); printf("*c : %d\n",*c); printf("\n"); g(*c); printf("c地址: %d\n",c); printf("*c : %d\n",*c); printf(

2021-12-23 22:42:22 447

原创 C语言 求最小公倍数和最大公约数的3种方法

#include <stdio.h>int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}int Gcd(int a,int b){ int temp; while(b!=0) { temp=a%b; a=b; b=temp; } return a;}int GCD(int a,int b){ int i; for(i=1;i<=a*b;i++) { if(i%a==0&a

2021-04-12 15:42:15 600

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除