25_03_16 图论得了MVP
https://kamacoder.com/problempage.php?pid=1170
- 1.所有可达路径:dfs的邻接表法和邻接矩阵法还很生疏
https://kamacoder.com/problempage.php?pid=1171 - 2.岛屿数量:广度优先搜索依赖队列并且bfs不会自己调用自己
数组越界有的时候是因为写成了grid[nextx][nexty]的原因
https://kamacoder.com/problempage.php?pid=1175 - 3.水流问题:难办?难办那就别办(┛◉Д◉)┛彡┻━┻ (交给函数去办)
https://kamacoder.com/problempage.php?pid=1176 - 4.建造人工最大岛屿:每个岛屿可以视为独立的一部分,可以分配索引独立算面积,然后用grid[x][y] == 0 去探路,注意area += 要去重,用 && set.insert(grid[x][y]).second 作为判断条件之一,最后要说的就是三重for循环小心复用i
https://kamacoder.com/problempage.php?pid=1183 - 5.字符串接龙:每次广搜的时候都会找到下一步,注意找到endStr的时候que没有开始下一次遍历,所以要提前加一,为什么要去重?举个例子:第一次:abc -> bbc ,第二次:bbc->abc,
然后就恶性循环了,广搜最先找到的必是最短的
https://kamacoder.com/problempage.php?pid=1178
- 6.岛屿的周长:漏条件
查并集,查查看两个元素是否在同一个集合里,只要返回有或无即可,不需要记录途径
https://kamacoder.com/problempage.php?pid=1182
-
6.5冗余链接II:ಠ_ಠ
https://kamacoder.com/problempage.php?pid=1053 -
7.最小生成树之prim算法:以当前节点为根节点生成最小生成树,更新minDist的数据,每次更新实现上一个源节点到下一个邻近节点的一条最短边,也就是说经过更新n-1次即可实现节点1~节点n的最小子树链接
因为题目求的是链接全部节点的最小代价,所以要把最小生成子树的“枝”加起来,才是全部代价。 -
8.最小生成树之kruskal算法:维护边,每次加入最小边,将边全部遍历一遍,利用查并集的性质排斥成环边,最后得到的一定是最小生成树,(比prim更好理解,记得find()里father[u] != u 的情况出现时还要压缩一遍路径:
return father[u] == u ? u:father[u] = find(father[u]);
)
https://kamacoder.com/problempage.php?pid=1191
- 9.拓扑排序:每去掉一个节点,入度数组--,将入度为0的节点放入队列,最后比较ans.size()与n的差距
注意输入可能有多个拓扑排序。
https://kamacoder.com/problempage.php?pid=1047
- 10.dijkstra算法:思路:在prim的基础上将minDist的含义改为起点到该点距离的累加值
朴素版:访问->访问周边/继承距离->切换下一个点
堆优化:
https://kamacoder.com/problempage.php?pid=1152
-
11.Bellman_ford算法:存在负权值的图,n-1次,每次对每条边进行松弛,minDist[n] 就是最短路径
松弛:minDist[b] = minDist[a] + val;//minDist[a] != INT_MAX;
松弛一次表示求的是离起点一条边相连的节点的最短距离https://kamacoder.com/problempage.php?pid=1153
判断是否存在负回路:再松弛1次(第n次)minDist[n] 改变,理论上可以无限缩小https://kamacoder.com/problempage.php?pid=1154
单源有限最短路:完全搞不懂学这个有什么意义
https://kamacoder.com/problempage.php?pid=1155
- 12.Floyd算法:构造三维双向图:
for(int k = 1;k<=n;k++){
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
grid[i][j][k] = min(grid[i][j][k-1],grid[i][k][k-1] + grid[k][j][k-1]);
}
}
}
看来grid数组中 k列是由 k-1列递推出来的,并且每个递推都需要遍历一遍二维grid[n+1][n+1]图寻找最小路径
总结:dfs(),bfs(),最小联通量计算,最短路径计算

浙公网安备 33010602011771号