博客
关于我
hdu 1875题解
阅读量:322 次
发布时间:2019-03-04

本文共 2354 字,大约阅读时间需要 7 分钟。

这段代码实现了一个最小生成树算法,结合了并查集(Union-Find)数据结构。以下是对代码的详细分析和解释:

代码结构

  • 预定义和初始化

    • pre[maxn] 数组用于记录每个节点的父节点。
    • node 结构体用于存储边的信息,包括起点、终点和权重。
    • cmp 函数用于对边进行排序,按权重从小到大排序。
  • 并查集操作

    • init() 初始化所有节点的父节点为自身。
    • find(x) 查找节点 x 的根节点,递归查找并更新父节点。
    • join(x, y) 将节点 xy 合并到同一个集合中。
  • 主函数

    • 读取输入数据,包括节点坐标和边信息。
    • 计算所有可能的边,并存储在 path 数组中。
    • 对边进行排序。
    • 使用并查集逐一将边加入,直到所有节点连成一棵树。
    • 计算最小生成树的总权重。
  • 代码解释

    • 预定义部分

      #include 
      #define maxn 10005using namespace std;

      包含了必要的头文件,定义了节点数的最大值 maxn

    • 结构体定义

      struct node {    int from, to;    double val;}

      用于存储边的信息,包括起点、终点和权重。

    • 比较函数

      bool cmp(node a, node b) {    return a.val < b.val;}

      用于对边按权重排序。

    • 初始化函数

      void init() {    for (int i = 1; i <= maxn; ++i) {        pre[i] = i;    }}

      初始化每个节点的父节点为自身。

    • 查找函数

      int find(int x) {    if (pre[x] != x) {        pre[x] = find(pre[x]);    }    return pre[x];}

      查找节点 x 的根节点,并进行路径压缩。

    • 合并函数

      bool join(int x, int y) {    int fx = find(x);    int fy = find(y);    if (fx != fy) {        pre[fx] = fy;        return true;    }    return false;}

      将节点 xy 合并到同一个集合中。

    • 主函数

      int main() {    int T;    cin >> T;    while (T--) {        init();        int n;        cin >> n;        for (int i = 1; i <= n; ++i) {            cin >> xx[i] >> yy[i];        }        int num = 0;        for (int i = 1; i <= n; ++i) {            for (int j = i + 1; j <= n; ++j) {                double dis = sqrt(pow(xx[i] - xx[j], 2) + pow(yy[i] - yy[j], 2));                if (dis >= 10 && dis <= 1000) {                    path[num].from = i;                    path[num].to = j;                    path[num].val = dis;                    ++num;                }            }        }        sort(path, path + num, cmp);        double ans = 0.0;        for (int i = 0; i < num; ++i) {            if (join(path[i].from, path[i].to)) {                ans += path[i].val;            }        }        int mark = 0;        bool flag = false;        for (int i = 1; i <= n; ++i) {            if (pre[i] == i) {                mark++;            }        }        if (mark > 1) {            flag = true;        }        if (flag) {            printf("oh!\n");        } else {            printf("%.1lf\n", ans * 100);        }    }    return 0;}

      读取输入数据,计算所有可能的边,并存储在 path 数组中。对边进行排序后,使用并查集逐一合并边,直到所有节点连成一棵树。最后计算最小生成树的总权重。

    代码优化建议

    • 路径压缩:在 find 函数中使用路径压缩优化查找和并查集性能。
    • 按权重排序:确保边是按权重从小到大排序,以保证Kruskal算法正确性。
    • 终止条件:检查是否所有节点连通,避免重复计算或错误输出。

    通过以上分析和优化,可以更好地理解和使用这段代码实现的最小生成树算法。

    转载地址:http://fxaq.baihongyu.com/

    你可能感兴趣的文章
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    nnU-Net 终极指南
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    NO 157 去掉禅道访问地址中的zentao
    查看>>
    no available service ‘default‘ found, please make sure registry config corre seata
    查看>>
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    查看>>
    no connection could be made because the target machine actively refused it.问题解决
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No qualifying bean of type ‘com.netflix.discovery.AbstractDiscoveryClientOptionalArgs<?>‘ available
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>