博客
关于我
poj 1258 Agri-Net
阅读量:793 次
发布时间:2023-03-03

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

为了解决连接所有农场并用最少光纤的问题,我们可以使用Kruskal算法来构建最小生成树。这是一个经典的图论问题,适合使用并查集(Union-Find)来高效解决。

方法思路

我们将每个农场看作图中的一个节点,农场之间的距离作为边的权重。目标是找到连接所有节点的最小总权重的树。

  • 读取输入:首先读取输入数据,构建一个N×N的距离矩阵。
  • 生成所有边:遍历矩阵,生成所有节点之间的边,并存储它们的权重。
  • 排序边:将所有边按照权重从小到大排序。
  • 并查集初始化:每个节点最初都是一个独立的集合。
  • 构建最小生成树:从排序后的边中,依次选择不形成环路的最小边,将其加入生成树,并合并相应的集合。重复这个过程直到所有节点连通。
  • 解决代码

    #include 
    #include
    #include
    #include
    #include
    #include
    using namespace std; #define N_MAX 100 #define INF 100005 struct Node { int u, v, l; }; int parent[N_MAX]; int rank[N_MAX]; bool cmp(Node a, Node b) { return a.l < b.l; } void main() { freopen("D:\\input.txt", "r", stdin); int n; while (scanf("%d", &n) != EOF) { int edges[N_MAX][N_MAX]; for (int i = 0; i < n; ++i) { int len = 0; do { char c; istringstream iss; iss >> c; if (c == ' ') continue; iss >> edges[i][len]; len++; } while (len < n); } int m = 0; int sum = 0; for (int i = 0; i < n; ++i) { parent[i] = i; rank[i] = 1; } vector
    p; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { if (edges[i][j] != 0) { p.push_back({i, j, edges[i][j]}); } } } sort(p.begin(), p.end(), cmp); int components = n; int res = 0; while (components > 1 && !p.empty()) { Node edge = p.front(); p.pop_front(); int u = edge.u; int v = edge.v; int root_u = find(u); int root_v = find(v); if (root_u != root_v) { sum += edge.l; if (rank[root_u] > rank[root_v]) { parent[root_v] = root_u; } else { parent[root_u] = root_v; if (rank[root_u] == rank[root_v]) { rank[root_v]++; } } components--; } } if (components == 1) { cout << sum << endl; } else { cout << -1 << endl; } } }

    代码解释

  • 读取输入:使用freopen读取输入文件,逐行读取并解析成整数。
  • 构建边列表:遍历距离矩阵,生成所有可能的边,并存储其权重。
  • 排序边:使用sort函数对边按权重排序。
  • 并查集操作:使用findunion操作来管理连通性,避免环路。
  • 构建生成树:依次选择最小边,直到所有节点连通,计算总权重并输出结果。
  • 这种方法确保了在最少的光纤中连接所有农场,满足了问题的需求。

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

    你可能感兴趣的文章
    pip install goose-extractor // SyntaxError: Missing parentheses in call to 'print'
    查看>>
    pip install mysqlclient报错
    查看>>
    pip install 出现报asciii码错误的解决
    查看>>
    pip throws TypeError: parse() got an unexpected keyword argument ‘transport_encoding‘ 在尝试安装新软件包时
    查看>>
    pip 下载慢
    查看>>
    pip 升级报错AttributeError: ‘NoneType’ object has no attribute ‘bytes’
    查看>>
    pip 安装opencv-python卡死
    查看>>
    pip 安装出现异常
    查看>>
    Pip 安装失败:需要 SSL
    查看>>
    Pip 安装挂起
    查看>>
    pip 或 pip3 为 Python 3 安装包?
    查看>>
    pip 文件损坏导致 pip无法使用 报错 ImportError: cannot import name 'main' from 'pip._int
    查看>>
    pip 无法从 requirements.txt 安装软件包
    查看>>
    pip/pip3更换国内源
    查看>>
    pip3 install PyQt5 --user 失败
    查看>>
    pip3命令全解析:Python3包管理工具的详细使用指南
    查看>>
    pip3安装命令重复创建文件‘/tmp/pip-install-xxxxx/package‘失败
    查看>>
    PIPE 接口信号列表
    查看>>
    pipeline配置与管理Job企业级实战
    查看>>
    pipeline项目配置实战
    查看>>