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

    你可能感兴趣的文章
    Python-通过函数传递变量
    查看>>
    Python内置函数详解——总结篇
    查看>>
    Python.对象集合中的标识.和散列
    查看>>
    Python.硒.拖放错误“AttributeError:move_to 需要 WebElement“
    查看>>
    Python内置函数详解
    查看>>
    Python/Kivy:从一个类调用函数到另一个类并在 Python 中显示小部件
    查看>>
    Python/Kivy:我可以在双击标签时调用函数吗
    查看>>
    python内置函数5-frozenset()
    查看>>
    Python/Plotly:如何使用要显示的信息自定义悬停模板?
    查看>>
    Python/Selenium - 无法单击 www.instagram.com 上的“接受 cookie“按钮
    查看>>
    Python内置函数(35)——next
    查看>>
    python写入mysql
    查看>>
    python写入csv老是乱码或者各种不好
    查看>>
    Python内置函数
    查看>>
    Python2 安装MySQLdb库
    查看>>
    Python2 已终结,入手Python 3,你需要这30个技巧
    查看>>
    python写下拉列表在excel,无法使用python获取Excel下拉列表(组合框)值
    查看>>
    python2.7安装
    查看>>
    Python2.7安装ncmbot时提示:Microsoft Visual C++9.0 is required
    查看>>
    PYTHON2.Git.1
    查看>>