摘要: 大概的思路是线封死一条边i -> j,再找i到j的最短路dis[i][j]。dis[i][j] + w[i][j]就是一个环。找到所有环里的最小值就能得到最小环。不过。。。用dijkstra算单源最短路的话,这个的时间杂度是O(n^4);所以可以用floyd将时间复杂度控制在O(n^3)上。思路是在floyd算法进行松弛的时候就找这个最小环。ans = min(ans, dis[i][j] + w[i][k] + w[k][j]); 这样 k -> i - >.... -> j -> k就得到了一个最小环。具体实现如下:void dfs(int i, int j) 阅读全文
posted @ 2012-07-18 21:35 AC_Von 阅读(8215) 评论(0) 推荐(0)
摘要: 又是生成树问题。。。次小生成树,顾名思义就是比最小稍微大那么一点点的生成树,^_^方法是:1、找到最小生成树,值为mst2、最小生成树种的点:找到每一个点到其它点的路径上的最大边权值 dp[i][j]表示i到j路径上的最大边权值3、加一条不在最小生成树上的边。比如i - k,同时删除在最小生成树上i -> k路径上最大的一个边权值dp[i][k]; 这样会得到 new_mst,在这些new_mst中找一个最小的,就是次小生成树的值实现上用到一些技巧,代码如下POJ 1679:View Code #include <iostream>#include <cstdio> 阅读全文
posted @ 2012-07-18 16:58 AC_Von 阅读(1619) 评论(0) 推荐(0)
摘要: 定义:一个有向图,存在从某个点开始的到达所有的的一个最小生成树,则它就是最小树形图。从早晨到现在一直在翻资料,终于理解了一点。朱-刘算法的大概过程如下:1、找到除了root以为其他点的权值最小的入边。用In[i]记录2、如果出现除了root以为存在其他孤立的点,则不存在最小树形图。3、找到图中所有的环,并对环进行缩点,重新编号。4、更新其他点到环上的点的距离,如:环中的点有(Vk1,Vk2,… ,Vki)总共i个,用缩成的点叫Vk替代,则在压缩后的图中,其他所有不在环中点v到Vk的距离定义如下:gh[v][Vk]=min { gh[v][Vkj]-mincost[Vkj] } (1<=j 阅读全文
posted @ 2012-07-18 09:48 AC_Von 阅读(10378) 评论(0) 推荐(0)