BZOJ 1083: [SCOI2005]繁忙的都市【Kruscal最小生成树裸题】
1083: [SCOI2005]繁忙的都市
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2925 Solved: 1927
[Submit][Status][Discuss]
Description
城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市C的道
路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连
接。这些道路是双向的,且把所有的交叉路口直接或间接的连接起来了。每条道路都有一个分值,分值越小表示这
个道路越繁忙,越需要进行改造。但是市政府的资金有限,市长希望进行改造的道路越少越好,于是他提出下面的
要求: 1. 改造的那些道路能够把所有的交叉路口直接或间接的连通起来。 2. 在满足要求1的情况下,改造的
道路尽量少。 3. 在满足要求1、2的情况下,改造的那些道路中分值最大的道路分值尽量小。任务:作为市规划
局的你,应当作出最佳的决策,选择那些道路应当被修建。
Input
第一行有两个整数n,m表示城市有n个交叉路口,m条道路。接下来m行是对每条道路的描述,u, v, c表示交叉
路口u和v之间有道路相连,分值为c。(1≤n≤300,1≤c≤10000)
Output
两个整数s, max,表示你选出了几条道路,分值最大的那条道路的分值是多少。
Sample Input
1 2 3
1 4 5
2 4 7
2 3 6
3 4 8
Sample Output
HINT
Source
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1083
题意
给定一张图,求其最小生成树中权值最大的边
要是学习过最小生成树的相关概念,就会发现这道题就是直接考察的最小生成树,只不过题目没有问你最小生成树的边权和,而是让你输出最小生成树有几条边(点数-1)和权值最大的那条边的权值。
那么什么是生成树呢?
In the mathematical field of graph theory, a spanning tree T of an undirected graph G is a subgraph that is a tree which includes all of the vertices of G. In general, a graph may have several spanning trees, but a graph that is not connected will not contain a spanning tree (but see Spanning forests below). If all of the edges of G are also edges of a spanning tree T of G, then G is a tree and is identical to T (that is, a tree has a unique spanning tree and it is itself).

如上图所示,生成树就是在给定的图中选取最少的边使所有顶点连通,那么最小生成树就是选取的边的权值和最小。
了解了生成树的概念,就很容易能明白生成树只有n-1条边,其中n表示顶点数。
那么怎么求最小生成树呢?
这里我介绍kruscal算法。
克鲁斯卡尔算法
该算法用到的是贪心思想,将所有的边按权值排序,每次都选权值最小的边,然后判断这条边的两个顶点是否属于同一个连通块,如果不属于同一个连通块,那么这条边就应属于最小生成树,逐渐进行下去,直到连通块只剩下一个。
kruscal算法的模板代码如下:
- const int maxn=;//最大点数
- const int maxm=;//最大边数
- int n,m;//n表示点数,m表示边数
- struct edge{int u,v,w;} e[maxm];//u,v,w分别表示该边的两个顶点和权值
- bool cmp(edge a,edge b)
- {
- return a.w<b.w;
- }
- int fa[maxn];//因为需要用到并查集来判断两个顶点是否属于同一个连通块
- int find(int x)
- {
- if(x==fa[x]) return x;
- else return fa[x]=find(fa[x]);
- }
- int kruscal()
- {
- int ans=-;
- sort(e+,e++m,cmp);
- for(int i=;i<=n;++i) fa[i]=i;//初始化并查集
- int cnt=n;
- for(int i=;i<=m;++i)
- {
- int t1=find(e[i].u);
- int t2=find(e[i].v);
- if(t1!=t2)
- {
- if(cnt==) break;
- fa[t1]=t2;
- ans=max(ans,e[i].w);
- cnt--;
- }
- }
- return ans;
- }
针对这道题,我们只需要把ans+=e[i].w改为ans=max(ans,e[i].w)就好了,至此问题得到了解决。
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn=;///最大点数
- const int maxm=;///最大边数
- int n,m;///n表示点数,m表示边数
- struct edge
- {
- int u,v,w;///u,v,w分别表示该边的两个顶点和权值
- }e[maxm];
- bool cmp(edge a,edge b)
- {
- return a.w<b.w;
- }
- int fa[maxn];///判断两个点是否属于同一个连通块
- int find(int x)
- {
- if(x==fa[x])
- return x;
- else return fa[x]=find(fa[x]);
- }
- int kruscal()
- {
- int ans=-;
- sort(e+,e++m,cmp);
- for(int i=;i<=n;i++)
- fa[i]=i;///初始化并查集
- int cnt=n;
- for(int i=;i<=m;i++)
- {
- int t1=find(e[i].u);
- int t2=find(e[i].v);
- if(t1!=t2)
- {
- if(cnt==)
- break;
- fa[t1]=t2;
- ///ans+=e[i].w;
- ans=max(ans,e[i].w);
- cnt--;
- }
- }
- return ans;
- }
- int main()
- {
- cin>>n>>m;
- for(int i=;i<=m;i++)
- {
- cin>>e[i].u>>e[i].v>>e[i].w;
- }
- cout<<n-<<" ";
- cout<<kruscal()<<endl;
- return ;
- }
BZOJ 1083: [SCOI2005]繁忙的都市【Kruscal最小生成树裸题】的更多相关文章
- BZOJ 1083 [SCOI2005]繁忙的都市 (最小生成树裸题无重边) 超简单写法!!
Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口 ...
- Bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)
Bzoj 1083: [SCOI2005]繁忙的都市 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1083 此题是最小瓶颈生成树的裸题. ...
- BZOJ 1083: [SCOI2005]繁忙的都市 kruskal
1083: [SCOI2005]繁忙的都市 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1083 Description 城市C是一个非 ...
- BZOJ 1083: [SCOI2005]繁忙的都市(MST)
裸的最小生成树..直接跑就行了 ---------------------------------------------------------------------- #include<c ...
- BZOJ 1083 [SCOI2005]繁忙的都市
1083: [SCOI2005]繁忙的都市 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1664 Solved: 1080[Submit][Sta ...
- bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1083 思路:连接所有点,肯定最少是需要n-1条边的,也就是写个最小生成树,记得保存下最大的权 ...
- BZOJ 1083: [SCOI2005]繁忙的都市 裸的最小生成树
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1083 代码: #include<iostream> #include< ...
- 1083. [SCOI2005]繁忙的都市【最小生成树】
Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道 路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路 ...
- 【BZOJ1083】[SCOI2005]繁忙的都市(最小生成树)
[BZOJ1083][SCOI2005]繁忙的都市(最小生成树) 题面 BZOJ 洛谷 题解 模板题. #include<iostream> #include<cstdio> ...
随机推荐
- samba 搭建
#useradd -M -s /sbin/nologin kvmshare #mkdir /home/etl #chown kvmshare:kvmshare /home/etl 将本地账号添加到 s ...
- CET-4- translation1
questions 2017/10/17 多年来,家长和老手都曾得到过这样一种信息(message):尽量利用任何机会表扬孩子,对他们所干的任何事情都要说好.据说这样做有助于提高孩子的自尊.但是近来许 ...
- [置顶]
xamarin android 布局尺寸了解
为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接 ...
- 【ASP.NET MVC系列】浅谈NuGet在VS中的运用
一 概述 在我们讲解NuGet前,我们先来看看一个例子. 1.例子: 假设现在开发一套系统,其中前端框架我们选择Bootstrap,由于选择Bootstrap作为前端框架,因此,在项目中,我们 ...
- Linux第七节随笔-中 /date / ln /
4.date link 作用:显示或设定系统的日期与时间 参数: -d<字符串> 显示字符串所指的日期与时间.字符串前后必须加上双引号. -s<字符串> 根据字符串来设置日期与 ...
- 我的第一个python web开发框架(19)——产品发布相关事项
好不容易小白将系统开发完成,对于发布到服务器端并没有什么经验,于是在下班后又找到老菜. 小白:老大,不好意思又要麻烦你了,项目已经弄完,但要发布上线我还一头雾水,有空帮我讲解一下吗? 老菜:嗯,系统上 ...
- java RTTI笔记 之Class学习笔记(摘自java编程思想)
1.java 使用Class对象来执行其RTTI.java 中每个类在编译后都会对应产生一个Class对象(更恰当地说是被保存在一个同名的.class文件中),甚至void和基本类型也都对应一个cla ...
- kafka资料
https://www.cnblogs.com/the-tops/p/5685955.html
- 利用USearch去除嵌合体(chimeras)
嵌合体序列指在pcr过程中,两条不同的序列产生杂交扩增的序列,属于人工污染,在ITS和16S分析中,应该首先去除,USearch提供去除嵌合体的功能 usearch -uchime_ref reads ...
- robotframework的学习笔记(十三)------Robot Framework常用库简介
标准库 Robot Framework可以直接导入使用的库,包括: Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 Dialogs:提供了暂停测试执行和从用户的输入方式 ...