图论算法

robby @ 2005-11-07 22:16

重新开始,踏踏实实地学好每一点知识8|

DFS相关算法,关键是结点的颜色和时间戳的记录

1.有向图的强连通分量(见CLRS)

先DFS一遍,记录每个结点访问完毕的顺序,然后把顺序反过来再DFS,即可找出每个强连通分量

相关题目: 
TOJ 1794 The Bottom of a Graph


2.无向图的割点和桥(见lrj书)

算法基于以下原理:(1)如果根顶点的儿子数大于1,则根顶点是割点(2)如果一个点和这个点的子孙都不存在指向这个点祖先的后向边,则这个点为割点。实现时需要对每个结点记录一个low值,表示该结点的子孙能够到达的最小的深度,如果这个值小于或等于该点的深度,则该点为割点。如果y是x的儿子并且y的low值大于x的深度,则边(x,y)为图的桥。

相关题目:
TOJ 1026 Network
ZOJ 2588 Burning Bridges 
robby @ 2005-12-04 11:31

生成树问题

1。基本的最小生成树

prim算法:简单实现的复杂度是O(n^2),一般情况下已经够用了,借助堆可以达到O(nlogm),但是从来写过,汗……

kruskal算法:简单实现的复杂度是O(m*a(n,m)),其中a(n,m)是并查集运算的时间,可以用于稀疏图以及一些prim不适用的变形问题

关于最小生成树有一个有趣的结论:最小生成树一定是所有生成树里面最大边的权最小的。

相关题目:
太多太多了...

2。最小度限制生成树

主要是一个“可行交换”的概念,简单说就是加入一条边必定形成一个环,然后去掉环上一条边必定又是一棵树。先把v0点从图中除去,求出剩下的图的各连通分量的最小生成树,把各生成树与v0用最小权的边连起来,如果有k个连通分量,这时候就是一棵最小k度限制生成树。然后不停地进行最小可行交换,形成k+1度,k+2度……直到达到要求为止。算法复杂度O(kn+n^2)

在另一本书上看到一种k-->k-1-->k-2的算法,感觉挺有趣的,不太好实现

相关题目:
TOJ 1993 Picnic Planning

3。次小生成树

同样利用“可行交换”,先求出最小生成树,然后枚举不在树上的边,计算把该边加进去并除去环上最大边后的权值和,取最小的一个即为次小生成树。注意求出最小生成树后要用O(n^2)的预处理计算出任意两点在树上的路径的最大边的权值。算法复杂度O(n^2)

相关题目:
POJ 1679 The Unique MST
(数据比较弱,我写了一个连自己出的数据都不对的居然就AC了,ft~)
robby @ 2005-12-17 11:26

最小树形图

树形图的性质:有向图,有N个顶点,N-1条弧,其中有一个点入度为0,称为树形图的根,其余的点入度都为1,树形图中一定不含圈。

最小树形图实际上可以看作有向图上的“最小生成树”,但比求无向图的最小生成树复杂了好多,算法的关键是对有向圈的收缩和展开,大致的思路是:

首先求每个点的权值最小的入弧,形成一个新图,但这个图有可能含有圈。下一步就是把圈收缩成一个人造顶点,并修改相应的弧的权值,然后继续求新图的最小入弧图,如果有圈则继续收缩,直至没有圈为止得到的是一个含有人造顶点的树形图,再按照一定规则把人造顶点展开。

理论上复杂度是O(mn),但以我的水平想要实现起来是不可能的,断断续续写了好多天也没写出来,只好把书上那个pascal的改过来完事 >__< ps,那个也不是O(mn)的。

 

转载于:https://www.cnblogs.com/marsmars/archive/2008/02/18/2298975.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值