并查集
文章平均质量分 65
嘎达啊
无名小卒
展开
-
hdu1232
#include using namespace std; int father[1005]; int find_fa(int x) { if(father[x] != x) father[x] = find_fa(father[x]);//查找 路径压缩; return father[x]; } int main() { int n, m; while(原创 2013-06-01 12:48:13 · 354 阅读 · 0 评论 -
hdu1856
#include #include using namespace std; const int maxn = 10000005; int f[maxn]; int a[maxn]; void gg() { for(int i = 1; i <= maxn; i++) { f[i] = i; a[i] = 1; } } int find原创 2013-06-01 19:41:22 · 483 阅读 · 0 评论 -
hdu1272
求是不是有回路,和是不是通路,如果两点的父节点是相同,则是 回路, #include #include using namespace std; const int maxn = 100010; int f[maxn], s[maxn], flag; int find_fa(int x) { while(x != f[x])//不能压缩路径; x = f[x];原创 2013-06-03 21:24:58 · 454 阅读 · 0 评论 -
hdu1308
这道题我只在poj上ac了; 主要考虑几个地放 1:空的也是树, 如(0, 0); 2: 要保证连通性,如,1 2, 2 3, 4 5, 0 0这就不符合; 3:因为是有向图,也不能是双向, 也不能是回路;1 1, 0 0 不符合; 1 2, 2 1, 0 0; 4 :1 2, 0 0也是满足的; #include #include using namespace std; const i原创 2013-06-04 15:31:01 · 634 阅读 · 0 评论 -
hdu1198并查集
并查集: 行中有哪些图能够连接,列中有哪些图能够连接,分别记录他们, 这样就构成一个并查集的模型,每次把输入的数据遍历,用并查集记录他们 最后再找几个最高父节点; #include #include int up[8],down[8],left[8],right[8]; int f[2550]; char map[55][55]; char ud[100][100], lr[100][10原创 2013-06-04 19:38:09 · 453 阅读 · 0 评论 -
hdu3635
经过很多次的修改 终于以 703ms ac 了。 思路:建立一个没有路劲压缩的并查集,在建的过程中用一个数组cs[]记录每个城中的龙珠数目; 用一个k来记录某个龙珠被移动的次数; 吸收换行时要注意 我错了很多次; #include #include using namespace std; int f[10005], k, cs[10005];//cs[]每个城中的龙珠; int n_n,原创 2013-06-05 16:12:30 · 437 阅读 · 0 评论 -
hdu2473
主要是设置虚点,如果某个点被删,并不真正的把他从集合中 删除,而是让他变成一个集合中没有的点,主要靠res数组 完成; #include #include using namespace std; const int maxn = 1e6+1e5+5; int f[maxn], res[maxn], ans; bool hash[maxn]; void init(int x) {原创 2013-06-08 19:31:50 · 640 阅读 · 0 评论 -
hdu 1325 poj 1308
树: 可以是空的 即空树 只输入 0 0; 森林不是树,(这个条件可以通过看并查集的结果是否联通); 不能有环,如 6 6 自身是环, 5 1(1上司是5), 1 5(5的上司还是5), 也是环; 并查集的时候是反方向的,如 5 1 f[1] = 5; 输入 a, b的时候 如果b的上司不是自己的话 那么 之前他的入度一定大于0;不符合每个元素只有一个入度; #include #incl原创 2013-07-25 22:42:54 · 447 阅读 · 0 评论