并查集与最小生成树.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
并查集与最小生成树

并查集与最小生成树 并查集与最小生成树 最小生成树 1 概念:及特点 所谓最小生成树是连通图的一个子图,在网中去掉一些边,恰好剩N-1条边。 使得边权总和最小。 它是一种边权总和最小的树形结构 联通且无圈 例题一:建光缆系统 N个城市中,设计了许多条把两个城市连接起来的光缆,但还未施工。 这些光缆各有预算且足可以把所有城市全部联通。 请你从中选择出若干个设计,既保证N个城市能联通,又满足总预算最小。 我们先来解决求最小预算的问题。 具体算法 ① prim算法 设f[x]为x点连入整个树结构的最小关联值。用类似于最短路的刷新式动归,从一个点出发,把整个图的每个点以最小的关联代价连入一棵二叉树。 参考代码: #include iostream using namespace std; int main() { int n, m, i, j, a, b, c, min, p, s = 0; cin n m; int q[n + 1], g[n + 1][n + 1], h[n + 1][n + 1]; memset(h, 0, sizeof(h)); memset(g, 1, sizeof(g)); for (i = 1; i = m; i++) { cin a b c; g[a][b] = g[b][a] = c; h[a][++h[a][0]] = b; h[b][++h[b][0]] = a; } for (i = 1;i = n; i++) { g[i][i] = 0; q[i] = g[1][i]; } for (i = 2; i = n; i++) { min = 2147483647; for (j = 2; j = n; j++) if (q[j] 0 q[j] min) { min = q[j]; p = j; } s += q[p]; q[p] = 0; for (j = 1; j = h[p][0]; j++) if (q[h[p][j]] != 0 g[p][h[p][j]] q[h[p][j]]) q[h[p][j]] = g[p][h[p][j]]; } cout s endl; system(pause); return 0; } 请对比从一点出发求最短路的DJS算法 课堂练习1 矿井用电 ② CRUS算法及并查树的应用 此算法用一种树状结构来表示一个集合,称为并查集。 这个树状结构也称为并查树。它为每个节点设一个指向双亲的指针(可以用整数来表示,直接记双亲的点号)。树根指针单独编码。 此种集合表示法结合着一个既能查询、又能维护和优化并查树的查询函数, 查询过程很简洁。求两个集合的并集更是方便。 求两个点是否同集,就看二者的并查集是否同根。 把A集合并入B集合只需让A的根指向B的根即可。 参考代码 #include iostream using namespace std; int p[100]; struct l { int a[2], len; }r[100]; int serch(int x) { if (p[x] 0) return x; return p[x] = serch(p[x]); } int main() { int n, m, i, j, s, js = 0, max = -1, t[2], ans = 0, num[100]; cin n m; for (i = 1; i = n; i++) p[i] = -1; for (i = 1; i = m; i++) cin r[i].a[0] r[i].a[1] r[i].len; for (i = 1; i m; i++) for (j = i + 1; j = m; j++) if (r[i].len r[j].len) swap(r[i], r[j]); for (i = 1; js n - 1

文档评论(0)

sy78219 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档