博客
关于我
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/

    你可能感兴趣的文章
    npm介绍以及常用命令
    查看>>
    NPM使用前设置和升级
    查看>>
    npm入门,这篇就够了
    查看>>
    npm切换到淘宝源
    查看>>
    npm切换源淘宝源的两种方法
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm包管理深度探索:从基础到进阶全面教程!
    查看>>
    npm升级以及使用淘宝npm镜像
    查看>>
    npm发布包--所遇到的问题
    查看>>
    npm发布自己的组件UI包(详细步骤,图文并茂)
    查看>>
    npm和package.json那些不为常人所知的小秘密
    查看>>
    npm和yarn清理缓存命令
    查看>>
    npm和yarn的使用对比
    查看>>
    npm如何清空缓存并重新打包?
    查看>>
    npm学习(十一)之package-lock.json
    查看>>
    npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
    查看>>
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>
    npm报错Cannot find module ‘webpack‘ Require stack
    查看>>
    npm报错Failed at the node-sass@4.14.1 postinstall script
    查看>>