博客
关于我
HDU 1102 Constructing Roads
阅读量:131 次
发布时间:2019-02-27

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

构造最小生成树以连接所有村庄。已知村庄之间的距离以及已有的连接边,使用Kruskal算法找到最小生成树的总权值。

题目大意是:有N个村庄,每个村庄间的距离已知。已知某些村庄之间有直接连接的道路,要求建造最少长度的道路,使得所有村庄互相连接。解决方法是使用Kruskal算法,构造最小生成树。

首先,读取输入数据,包括村庄间距离矩阵和已有的连接边。将所有可用的边进行排序,权重从小到大排列。使用并查集数据结构来跟踪各村庄的连通性。

遍历排序后的边,对于每条边,检查其连接的两个村庄是否在同一连通集合中。如果不在同一集合中,将这条边加入生成树,并将其权重累加到总长度中,同时合并两个村庄所在的集合。继续处理下一条边,直到形成包含所有村庄的连通图。

最终,输出生成树的总权重,即为所需最小的新建道路总长度。

解题步骤:

  • 读取村庄数量N和距离矩阵。
  • 读取已有的Q条连接边,记录其权重为0。
  • 收集所有村庄间的可用边,计算权重。
  • 按权重排序所有边。
  • 初始化并查集。
  • 遍历边,逐步合并连通的村庄,累加权重。
  • 当所有村庄连通时,输出总权重。
  • 代码实现:

    #include 
    #include
    #include
    using namespace std;#define MaxSize 101#define INF 0x7ffffffftypedef struct Edge { int u; int v; int w;} Edge;int cmp(const void *a, const void *b) { const Edge *c = (Edge *)a; const Edge *d = (Edge *)b; if (c->w != d->w) return c->w - d->w; else return d->u - c->u;}void kruskal(int dist[][MaxSize], int n, int &sum) { int edges = n * n; Edge E[edges]; int k = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (dist[i][j] != INF) { E[k].u = i; E[k].v = j; E[k].w = dist[i][j]; k++; } } } qsort(E, k, sizeof(Edge), cmp); int vset[n]; for (int i = 0; i < n; ++i) { vset[i] = i; } int j = 0; int components = n; sum = 0; for (int k = 0; k < k; ++k) { if (components == n) break; int u = E[k].u; int v = E[k].v; int root_u = vset[u]; int root_v = vset[v]; if (root_u != root_v) { sum += E[k].w; if (root_u > root_v) { vset[root_u] = root_v; } else { vset[root_v] = root_u; } components--; } }}int main() { int n, q, sum = 0; while (cin >> n) { int dist[n][MaxSize]; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cin >> dist[i][j]; } } cin >> q; for (int i = 0; i < q; ++i) { int a, b; cin >> a >> b; a--; b--; if (dist[a][b] == 0) { dist[a][b] = 0; dist[b][a] = 0; } else { dist[a][b] = 0; dist[b][a] = 0; } } kruskal(dist, n, sum); cout << sum << endl; } return 0;}

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

    你可能感兴趣的文章
    Neo4j的安装与使用
    查看>>
    Neo4j(2):环境搭建
    查看>>
    Neo私链
    查看>>
    nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Nessus漏洞扫描教程之配置Nessus
    查看>>
    Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
    查看>>
    NetApp凭借领先的混合云数据与服务把握数字化转型机遇
    查看>>
    NetBeans IDE8.0需要JDK1.7及以上版本
    查看>>
    netcat的端口转发功能的实现
    查看>>
    netfilter应用场景
    查看>>
    netlink2.6.32内核实现源码
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    NetScaler的常用配置
    查看>>
    netsh advfirewall
    查看>>
    NETSH WINSOCK RESET这条命令的含义和作用?
    查看>>
    Netty WebSocket客户端
    查看>>
    netty 主要组件+黏包半包+rpc框架+源码透析
    查看>>
    Netty 异步任务调度与异步线程池
    查看>>
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    Netty事件注册机制深入解析
    查看>>