随笔分类 -  算法学习小结

摘要:匈牙利算法是用来求二分图匹配的算法,一般有bfs和dfs两种实现,我一般都是写的dfs的实现,感觉这个比较好理解,实现也比较简单。二部图:若一个图的顶点可以划分到2个集合,使得每个集合内的顶点之间没有连边,那么这个图就叫做二分图或二部图。二分匹配问题:求最大边无关集。交替链:二分图的一条路径,路径的起点和终点来自于不同的集合,且均未被标记(未匹配),且路径中的相邻结点来自不同的集合。匈牙利算法:存在交替链<=>存在更优匹配为什么在maxmatch中只需对每个结点一次求一次交替链即可?答:因为每求一次交替链后,可能增加匹配成功的结点,上一次匹配成功的结点不会变(匹配方式可能变了),而 阅读全文
posted @ 2012-07-07 08:33 BeatLJ 阅读(356) 评论(1) 推荐(1) 编辑
摘要:该算法也是tarjan发现的,故也叫tarjan算法。这个算法的主体还是dfs,先看算法框架:void make_set(int i){p[i]=i;}int find_set(int i){if(i!=p[i])p[i]=find_set(p[i]);return p[i];}union_set(int i,int j){i=find_set(i),j=find_set(j);p[j]=i;}//tarjan算法主体void dfs(int u){int i,v;make_set(u);for(i=0;i<g[u].size();i++){v=g[u][i];if(p[v]==-1){ 阅读全文
posted @ 2012-07-07 08:32 BeatLJ 阅读(3640) 评论(0) 推荐(1) 编辑
摘要:tarjan算法的基本框架就是dfs,其基本原理是有向图至少存在一棵深搜子树,其结点集合构成一个强连通分量,这是显然的,因为必定有一个强连通分量最后被dfs,这个强连通分量的结点构成深搜树的一棵子树。有了以上结论后,求强连通分量就有思路了,我们在每棵子树深搜完成后判断这棵子树是否构成强连通分量即可,关键在于如何判断一棵子树是否构成强连通分量。注意到最先搜索完的子树是那些叶子结点,要判断叶子结点是否构成强连通分量很简单,若存在叶子结点与其祖先结点的连边,则该叶子结点不构成强连通分量,否则构成强连通分量。tarjan算法用pre[V]数组和low[V]数组来判断子树是否构成强连通分量,pre[v] 阅读全文
posted @ 2012-07-07 08:31 BeatLJ 阅读(969) 评论(0) 推荐(0) 编辑
摘要:第一遍dfs是对原图进行,求出每个结点的后序遍历顺序,也叫时间戳,注意保存方式,应该是保存每个时间点的访问的结点,而不是保存每个结点的访问时间;第二遍dfs是对逆图进行,根据第一遍dfs的结果,首先在逆图上从时间戳最大的结点开始dfs,可以得到第一个强连通分量,将遍历过的结点标记,然后从下一个时间戳最大的且尚未标记的结点开始dfs,可以得到第二个强连通分量,以此类推,直到所有结点都确定其所在的强连通分量,此时算法结束。首先分析由此算法得到的第一个强连通分量的正确性,易知时间戳最大的是有向图的根结点:1、从根结点出发,可以到达所有结点;2、第二遍dfs是在逆图上进行的,所以第二遍dfs得到的是所 阅读全文
posted @ 2012-07-05 12:15 BeatLJ 阅读(1633) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示