知识点:

知道什么是最小生成树,知道最小生成树的两种算法。最好是两种都知道。

单选题:

1-1给定有权无向图的邻接矩阵如下,其最小生成树的总权重是:(3分)

  • 22
  • 20
  • 15
  • 8

解析:在做选择题的时候,我更倾向与kruskal算法。

2-3给定有权无向图的邻接矩阵如下,其最小生成树的总权重是:(3分)

  1. 24
  2. 23
  3. 18
  4. 17

解析:我们按照贪心的思想,也就是kruskal算法每次增加当前剩余的权值最小边,检查是否形成环如果成环就跳过否则就加入。

2-4给定有权无向图如下。关于其最小生成树,下列哪句是对的? (3分)

  • 最小生成树不唯一,其总权重为23
  • 最小生成树唯一,其总权重为20
  • 边(B, F)一定在树中,树的总权重为23
  • 边(H, G)一定在树中,树的总权重为20

解析:按照kruskal算法。

2-5给定有权无向图如下。关于其最小生成树,下列哪句是对的? (3分)

  • 边(B, A)一定在树中,树的总权重为23
  • 边(D, C)一定在树中,树的总权重为20
  • 最小生成树不唯一,其总权重为23
  • 最小生成树唯一,其总权重为20

解析:同上。

编程题:

7-1 畅通工程之局部最小花费问题 (35 分)

某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全地区畅通需要的最低成本。

输入格式:

输入的第一行给出村庄数目N (1≤N≤100);随后的N(N−1)/2行对应村庄间道路的成本及修建状态:每行给出4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态 — 1表示已建,0表示未建。

输出格式:

输出全省畅通需要的最低成本。

输入样例:

4
1 2 1 1
1 3 4 0
1 4 1 1
2 3 3 0
2 4 2 1
3 4 5 0

输出样例:

3

AC代码:

#include <bits/stdc++.h>
using namespace std;const int maxn = 1000 + 5;
int N;
struct Edge {int x, y;int w, flag;Edge(int x, int y, int w, int flag) : x(x), y(y), w(w), flag(flag) {}bool operator < (const Edge &rhs) const {if(flag != rhs.flag) {return flag > rhs.flag;} else if(flag == rhs.flag) {return w < rhs.w;}}
};
vector<Edge> edge;
int F[maxn];int Find(int x) {return x == F[x] ? F[x] : F[x] = Find(F[x]);
}int main() {ios::sync_with_stdio(false);cin >> N;for(int i = 0; i <= N; i++)F[i] = i;for(int i = 0; i < N * (N - 1) / 2; i++) {int x, y, w, flag;cin >> x >> y >> w >> flag;edge.push_back(Edge(x, y, w, flag));}int cnt = 0, ans = 0;sort(edge.begin(), edge.end());for(int i = 0; i < edge.size(); i++) {
//        cout << edge[i].x << " " << edge[i].y << " " << edge[i].w << " " << edge[i].flag << endl;
//        cout << "cnt = " << cnt << endl;int xx = Find(edge[i].x);int yy = Find(edge[i].y);if(xx != yy) {if(!edge[i].flag)ans += edge[i].w;F[xx] = yy;cnt++;}}//cout << cnt << endl;cout << ans << endl;return 0;
}

7-2 畅通工程之最低成本建设问题 (30 分)

某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了有可能建设成快速路的若干条道路的成本,求畅通工程需要的最低成本。

输入格式:

输入的第一行给出城镇数目N (1<N≤1000)和候选道路数目M≤3N;随后的M行,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号(从1编号到N)以及该道路改建的预算成本。

输出格式:

输出畅通工程需要的最低成本。如果输入数据不足以保证畅通,则输出“Impossible”。

输入样例1:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

输出样例1:

12

输入样例2:

5 4
1 2 1
2 3 2
3 1 3
4 5 4

输出样例2:

Impossible

AC代码:

#include <bits/stdc++.h>
using namespace std;const int maxn = 1000 + 5;
int N, M;
struct Edge {int x, y;int w;Edge(int x, int y, int w) : x(x), y(y), w(w) {}bool operator < (const Edge &rhs) const {return w < rhs.w;}
};
vector<Edge> edge;
int F[maxn];int Find(int x) {return x == F[x] ? F[x] : F[x] = Find(F[x]);
}int main() {ios::sync_with_stdio(false);cin >> N >> M;for(int i = 0; i <= N; i++)F[i] = i;for(int i = 0; i < M; i++) {int x, y, w;cin >> x >> y >> w;edge.push_back(Edge(x, y, w));}int cnt = 0, ans = 0;sort(edge.begin(), edge.end());for(int i = 0; i < edge.size(); i++) {if(cnt == N - 1)break;int xx = Find(edge[i].x);int yy = Find(edge[i].y);if(xx != yy) {ans += edge[i].w;F[xx] = yy;cnt++;}}set<int> se;for(int i = 1; i <= N; i++) {se.insert(Find(i));}if(se.size() != 1)cout << "Impossible" << endl;elsecout << ans << endl;return 0;
}

注:检查图是否联通其实dfs或者是bfs遍历一次即可,然后检查是否所有的结点都被标记,如果都被标记就是连通图,否则就是不连通图。

在kruskal算法当中检查是否成环用到了并查集。

这两个题作为并查集的入门题目非常有价值,在HDU上的标记应该是浙江大学研究生复试上机的考试题。

Round14—最小生成树相关推荐

  1. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  2. [kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)

    L - 还是畅通工程 题目链接:https://vjudge.net/contest/66965#problem/L 题目: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府&qu ...

  3. 图的算法专题——最小生成树

    概要: Prim算法 Kruskal算法 1.Prim算法 算法流程: (1)对图G(V,E)设置集合S来存放已被并入的顶点,然后执行n次(2)(3) (2)每次从未并入顶点集合中选择与集合S最近的一 ...

  4. 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理

    蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...

  5. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...

  6. [vijos1234]口袋的天空最小生成树

    题目链接:https://vijos.org/p/1234 白天刚刚写完prim的算法,晚上就心血来潮的打了一道最小生成树的题 虽然有题解说可以用prim做,但是这道题明显是加最小的边,感觉krusk ...

  7. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  8. LA 5717枚举+最小生成树回路性质

    1 /*LA 5717 2 <训练指南>P343 3 最小生成树的回路性质 4 在生成的最小生成树上,新增一条边e(u,v) 5 若原图上u到v的路径的最大边大于e,则删除此边,加上e,否 ...

  9. 技术图文:如何利用C# 实现 Prim 最小生成树算法?

    背景 我们上一篇图文介绍了 如何利用 C# 实现 Kruskal 最小生成树算法?,Kruskal 算法通过寻找边最优的方式来构造最小生成树,本篇图文介绍如何利用 C# 实现 Prim 最小生成树算法 ...

  10. 技术图文:如何利用C# 实现 Kruskal 最小生成树算法?

    背景 以前我写过一些图文来介绍有关数据结构与算法的知识: 8大排序算法之:直接插入排序(Straight Insertion Sort) 8大排序算法之:希尔插入排序(Shell Insertion ...

最新文章

  1. 样式表中的 element.style样式如何修改
  2. 如何判断一个程序是 32bit 还是 64bit ?
  3. ns3 入门案例2:third.cc
  4. 基础知识很扎实 - 但是面试就是做不出来, 怎么办? (长, 慎入)
  5. mongodb php 删除,MongoDB / PHP:从数组中删除元素
  6. linux 每天_每天使用Linux的11种惊人方式
  7. Exalogic Elastic Cloud
  8. spring,springMVC,springBoot常用注解
  9. Linux中的静态库和动态库简介及生成过程示例
  10. OpenCV Mat类的convertTo函数,数据类型转换
  11. pilz pnoz s4说明书_pilz安全继电器PNOZ端子及接线功能描述(中英对照版)
  12. 思维导图----百度百科
  13. 论文阅读笔记:Weakly-supervised Semantic Segmentation in Cityscape via Hyperspectral Image
  14. matlab 实现马赫带效应,图像上机实验.doc
  15. Android手机摄像头作为PC摄像头开发
  16. PDF转图片再转长图、python、pil
  17. 2018年第16周-ZooKeeper基本概念(配搭建过程和Master-Workers例子)
  18. MathJax 与 Katex 在公式对齐、编号、交叉引用方面的不同
  19. 瑞士名表排名介绍及手表品牌识别
  20. linux xunsou_mysql中文分词全文搜索索引讯搜的安装

热门文章

  1. VS2010上winform打包发布、打包安装程序(超全超详细)
  2. 获得各城市区号JS代码
  3. 计算机组成和体系结构-Flynn分类法
  4. IDEA安装谷歌翻译插件Translation
  5. 罗伊 我的火箭我的处 (原创)
  6. 计量经济学学习笔记:多元线性模型
  7. echarts 地图散点
  8. 百度地图API基本使用(二)
  9. [含论文+答辩PPT+任务书+中期检查表+源码等]基于ssm的NBA球队管理系统
  10. 图片php木马制作教程,图片木马制作大法