![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
带你深入浅出图论
矩阵不需要秩
你被击倒多少次都不重要,重要的是你有多少次爬了起来。
展开
-
图的深度优先遍历
【代码】图的深度优先遍历。原创 2023-09-24 23:16:44 · 30 阅读 · 0 评论 -
图的宽度优先遍历
【代码】图论的遍历。原创 2023-09-24 23:20:00 · 95 阅读 · 0 评论 -
求最短路(Dijkstra算法)
首先,这里的数据范围比较大,所以使用邻接表来存储。然后这里heap存的pair类型的数据,注意这里的first和second不要交换,first存的是距离,因为要对距离排序。最后就是dijkstra算法的本质了,每次在被更新的点中取一个距离最小的点(这个点的要在!st集合中),每次更新一次,就将这个点加入st集合当中。最重要的是找到一个没有被确定最短路的距离起点最短的点。首先dijkstra算法的最重要的一点是每次找到被更新的距离的所有点中的一个距离最小的点,然后去更新一下他能到达的点的距离。原创 2023-09-24 23:13:45 · 39 阅读 · 0 评论 -
求最小生成树(kruskal)
2.逐次遍历每条边,如果当前边的两个点不在一个集合,那就把他们两个加到一个集合里面(加的过程中边数要加,权重也要加)。kruskal算法最慢的就是那个排序的过程,其他的是非常快的。算法流程非常的简单,因为有并查集的路径压缩。这里为什么就是最小生成树呢?因为我们遍历到的边都是最小的,所以总体就是最小的。3.最后判断边数是否为n-1。(如果不是也就是图不是联通的)1.对所有的边从小到大排序。原创 2023-09-26 20:27:54 · 63 阅读 · 0 评论 -
判定二分图(染色法)
2.已经有颜色了,然后判断一下当前这个点和他所能扩展到的点是不是相同的颜色,如果相同就返回false(这里的搜索只要有一个不符合要求直接返回false)。注意一下这里要遍历每个点然后进行dfs,如果从第一个点dfs的话,这个图可能不是一个。1.这个点没有被染色,那么就去染它。原创 2023-09-26 21:25:18 · 71 阅读 · 0 评论 -
求二分图的最大匹配(匈牙利算法)
妥协的过程就一直递归。那么匈牙利算法为什么可以找到最大匹配呢,因为我们每次遍历到新的点,都假定它的优先级最高,其他点都必须向他妥协,那么如果其他点可以妥协,就让新的点(霸道总裁)连接这个可以连的点,那不就是比原来的图又多了一条边吗,这样不就会一直增加吗,所以可以找到最大匹配。那就接着遍历他所能连接的第二个点(一直到他所能连接的第n个点),再继续最开始的过程,如果遍历刀到第k个点刚好可以让其他点妥协,那么就成功了。那么就让当前这个点连接他所能连接到的第一个点,另外一个放弃这个点,妥协然后和另外的点连接。原创 2023-09-26 20:15:14 · 48 阅读 · 0 评论