04 2019 档案

摘要:思路 A*搜索(bfs剪枝),评估函数由dijkstra给出,即从终点跑一遍dijkstra.然后从起点跑bfs,bfs设一个优先队列(按f值从小到大取出),每次入点时算一下f值,f=g+h,g为起点到当前点的实际距离,h为当前点到终点的估计距离,这里用之前跑的dijkstra来充当h.即f(i)= 阅读全文
posted @ 2019-04-16 09:20 VBL 阅读(146) 评论(0) 推荐(0)
摘要:适用范围 最小生成树问题 思路 按照边的权值从小到大排序,然后在不产生圈的前提下不断选取边加入生成树中.判断加入一条边后是否产生圈,只需判断边的两个端点是否已经在一个联通块中,这个过程可以用并查集高效实现.复杂度(ElogV)E边V点. 代码 1 //并查集代码 2 int par[MAX]; 3 阅读全文
posted @ 2019-04-15 15:00 VBL 阅读(177) 评论(0) 推荐(0)
摘要:概念 并查集是用来管理元素分组情况的数据结构.并查集有两个功能:1.查询a,b是否在同一分组 2.合并a,b为同一分组.并查集可以高效执行这两个功能.对于n个元素的并查集操作,平均复杂度小于(log(n)). 实现 并查集的结构是树状结构,并查集的核心是par[]数组,par[i]表示连接第i个点的 阅读全文
posted @ 2019-04-15 14:30 VBL 阅读(195) 评论(0) 推荐(0)
摘要:适用范围 最小生成树问题 思路 核心思想:贪心.对于一幅连通图,首先,先假设有一个只包含顶点v的数T,然后贪心选取T和其他点之间的最小权值的边,然后把它加入T,不断进行这个操作直到所有点的都在T里,这时T就是最小生成树.prim算法和dijkstra算法很相似,实现的时候也差不多,基础算法像dijk 阅读全文
posted @ 2019-04-14 17:31 VBL 阅读(227) 评论(0) 推荐(0)
摘要:适用范围 任意两点最短路(允许存在负边) 思路 核心思想:动态规划.设dp[k][i][j],表示i到j在前k个点的最短路,dp[0][i][j]表示i到j的最短路不经过任何点,于是dp[0][i][j]=cost[i][j].i到j的最短路在第k个点只有两种情况,如果i到j的最短路不经过k点,有d 阅读全文
posted @ 2019-04-11 13:37 VBL 阅读(261) 评论(0) 推荐(0)
摘要:适用范围 单源最短路 思路 核心思想:贪心.从第一个最短距离已经确定的点出发(起点),找到起点为最短距离确定的点的边,按边的权值从小到大通过这些边去更新这些边的终点(此过程可以用优先队列优化),从而不断确定点的最短距离,直到最后所有点的最短距离均确定.这里要说明一下,按原算法思路是无法跑负边的,因为 阅读全文
posted @ 2019-04-10 23:16 VBL 阅读(273) 评论(0) 推荐(0)
摘要:next数组 对于一个字符串,next[i]=k表示当前位置前面有k个字符(不包括全前缀)和开头k个字符一样,或者若当前位置匹配失败应该返回的下标处.kmp算法核心就是怎么求一个字符串的next数组. 模板 1 char s[MAX]; 2 int next[MAX]; 3 4 void kmp(i 阅读全文
posted @ 2019-04-08 22:37 VBL 阅读(210) 评论(0) 推荐(0)
摘要:概念 先讲一下离散化操作的概念,举个例子会比较好说明.对于一组数组比如a[5]=6,9,5,5,4.进行离散化操作后就变成3,4,2,2,1.也就是说当需要用到的信息与数的绝对大小无关而与相对大小有关的时候就可以用上离散化操作. 实现 实现离散化操作需要用到两个函数 unique函数 和 lower 阅读全文
posted @ 2019-04-08 20:31 VBL 阅读(311) 评论(0) 推荐(0)