算法
出门左拐是海
种一棵树最好的时间是十年前,其次是现在
展开
-
拓扑排序的注意点、模板、适用问题
一、注意点二、模板vector<int> G[MAXV];//邻接表int n,m,inDegree[MAXV];//顶点数,入度//拓扑排序bool topologicalSort(){ int num=0;//记录加入拓扑序列的顶点数 queue<int> q; for(int i=0;i<n;i++) { if(inDegree[i]==0) { q.push(i);//将所有的入度为0的顶点入队 } } while(!q.em原创 2021-11-21 16:21:50 · 479 阅读 · 0 评论 -
图最小生成树kruskal算法注意点、模板和适用问题
一、注意点二、模板struct edge{ int u,v; //边的两个端点 int cost; //边权}E[MAXV]; //最多有MAXE条边bool cmp(edge a,edge b){ return a.cost<b.cost;}int father[N];//并查集数组int findFather(int x){//并查集查询函数 ……}//kruskal函数返回最小生成树的边权之和,参数n为顶点个数,m为图的边数int kruskal(in原创 2021-11-21 15:43:12 · 482 阅读 · 0 评论 -
图最小生成树prim算法注意点、模板和适用问题
一、注意点该算法的原理同Dijkstra算法,也是不断将点加入集合的方式。二、模板//邻接表struct Node{ int v,dis;//v是边的目标顶点,dis为边权};vector<Node> Adj[MAXV];//图G,Adj[u]存放从顶点u出发可以到达的所有点int n;//n为顶点数,图G使用邻接表实现,MAXV为最大顶点数int d[MAXV];//顶点与集合s的最短距离bool vis[MAXV]={false};//标记数组,vis[i]==true表原创 2021-11-21 15:16:40 · 796 阅读 · 0 评论 -
图最短路径Floyd算法的注意点、模板、适用问题
一、注意点不能将外层k循环放置内层二、模板const int INF=100000000;const int MAXV =200;//MAXV最大顶点数int n,m;//n为顶点数,m为边数int dis[MAXV][MAXV];//dis[i][j]表示顶点i和顶点j的最短距离void Floyd(){ for(int k=0;k<n;k++)//遍历每一个点作为中介点 { for(int i=0;i<n;i++)//遍历每一个点作为一个端点 { for(原创 2021-11-20 21:15:24 · 370 阅读 · 0 评论 -
图最短路径Bellman-Ford算法注意点、模板和适用问题
一、注意点正规的程序步骤应该分为两步:执行算法进行计算验证图内部是否有负环,如果有则该算法不适用二、模板struct Node{//v是邻接边的目标顶点,dis为邻接边的边权 int v,dis;};vector<Node>Adj[MAXV];//图G的邻接表int n; //n为顶点数,MAXV为最大顶点数int d[MAXV]; //起点到达各点的最短路径长度bool Bellman(int s)//s是源点{ fill(d,d+MAXV,INF);原创 2021-11-20 20:37:16 · 673 阅读 · 0 评论 -
最常考察的动态规划算法(共七个)
本文一方面用于自身备考,一方面进行整理和总结注意点。参考《算法笔记》基本结构是:类型介绍程序模板注意点一、最大连续子序列和1.类型介绍给定一个数字序列A1,A2……An,求i,j使得Ai+……+Aj最大,输出最大和。样例:-2 11 -4 13 -5 -2最大和为11+(-4)+13=202.模板//第一步,令dp[i]表示以A[i]为末尾的连续序列最大和//第二步,状态转移方程dp[0]=A[0];for(){ dp[i]=max(A[i],dp[i-1]+A[i])原创 2021-11-19 09:33:06 · 607 阅读 · 0 评论 -
图最短路径Dijkstra算法的注意点、模板、适用问题
一、注意点无权图可以适用广度优先搜索算法进行解决,广度优先搜索的总结如下:https://blog.csdn.net/I_canjnu/article/details/121147016?spm=1001.2014.3001.5501但是对于带权图,就不能再用广度优先搜索算法了,因为最短路径取决于权值之和而不再是跨越的层数,所以要使用Dijkstra算法,其本质为建立一张起点到各个其他顶点的距离表,并且不断刷新,直到找到结果。需要注意的是,Dijkstra算法只适用于边权为正数的情况,如果边权是负数原创 2021-11-05 18:28:43 · 1648 阅读 · 0 评论 -
并查集注意点、模板和适用题型
一、注意点并查集本质上可以将其看作集合。对于三个并查集,就可以将其看作三个集合,每个集合有一个代表元,用来标记集合内部元素的归属。并查集用数组实现。例如,1班,2班,3班各有40人,每个班都有自己的班长。当这120人随即两人相遇时,互相报出各自的班长名字,两人一核对。对上了!那就是一个班的人,对不上,那就不是一个班级的人。由此可见,并查集往往用于处理非连通的图的问题,比如敌我双方分类、群体派别分类等。并查集需要注意以下几个问题:初始化init()、寻找find()、合并join()三个核心函数路原创 2021-11-05 16:58:45 · 265 阅读 · 0 评论 -
广度优先搜索算法BFS注意点、模板和适用题型
一、注意点在这里我将广度优先搜索算法常用来解决的问题:寻找最短路径写在最前面,以方便理解。可以想象一个石子投到水里,在水面泛起波纹,如果将数学直角坐标系代入进入。波纹核心是源点,那么广度优先就是一层一层波纹往外扩,寻找一片附近漂浮的树叶。这样一层一层的找,找到树叶时候恰好是第i层,那么寻找到树叶的最小步数(最短路径、最少波纹层数)就得到了。广度优先搜索需要注意的点是:如何实现一层一层的遍历?到什么时候结束?问题1考虑深度优先搜索,一条路线走到黑,广度优先搜索需要的是一次性放进候选区n个节点,原创 2021-11-04 17:42:23 · 719 阅读 · 0 评论 -
深度优先搜索算法DFS注意点、模板、适用题型
一、注意点深度优先搜索算法最为明晰的解释就是使用走迷宫,一条路走到黑,这个例子进行讲述。其本质问题是使用递归的方式将所有的可能性都进行遍历,逐个核对,以得到要求的结果。以下给出核心问题,可以对照第二部分的模板进行阅读。DFS的核心问题是:走到什么时候结束?如何遍历?多少条路需要走到黑?问题1第一个问题即收敛条件问题,也就是边界值问题。当走到边界值处(例如走到了迷宫某一条路的尽头)将会根据题目的要求进行评价,以决定该路径是否是我们要找的那一条路。(在迷宫问题中即判断是否到达了出口,如果到达原创 2021-11-04 16:48:16 · 1098 阅读 · 0 评论