摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2144思路:合并的过程中多了一个条件,而这个条件的判断可以通过求最长公共连续子序列得到,别的和普通的并查集没什么区别,最后就是简单地判断一下集合的个数即可。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 111 7 char str[MAXN][MAXN]; 8 阅读全文
posted @ 2013-06-09 16:30 ihge2k 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2860思路:多了一个记录每个集合最小值的value数组而已,然后判断的时候小心一点就可以了。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 100000+100 7 int parent[MAXN]; 8 int value[MAXN]; 9 int n,m,k 阅读全文
posted @ 2013-06-09 15:52 ihge2k 阅读(454) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4126思路:我们可以先求最小生成树,对于最小生成树的每一条边,我们要找到它的最佳替代边,使其价值最小。具体实践方法:假设两个各自连通的部分分别为树A,树B,dp[i][j]表示树A中的点i到树B(点j所在的树的最近距离),这个很容易用dfs实现,然后通过求出的dp[i][j],再用一个dfs求出树B到树A的最近距离(就是枚举树A中的所有点 到 树B的最近距离,取其中的最小值),这个求出来的值其实就是我们要求的最佳替代边,将它保存到一个数组中即可。总的时间复杂度为O(n^2)。 1 #include. 阅读全文
posted @ 2013-06-09 09:20 ihge2k 阅读(692) 评论(0) 推荐(0) 编辑