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(),最小联通量计算,最短路径计算
posted @ 2025-03-20 20:36  Tongkuly  阅读(30)  评论(0)    收藏  举报