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

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

Sample Output

3 6

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).

Paste_Image.png

如上图所示,生成树就是在给定的图中选取最少的边使所有顶点连通,那么最小生成树就是选取的边的权值和最小。


了解了生成树的概念,就很容易能明白生成树只有n-1条边,其中n表示顶点数。
那么怎么求最小生成树呢?
这里我介绍kruscal算法。


克鲁斯卡尔算法
该算法用到的是贪心思想,将所有的边按权值排序,每次都选权值最小的边,然后判断这条边的两个顶点是否属于同一个连通块,如果不属于同一个连通块,那么这条边就应属于最小生成树,逐渐进行下去,直到连通块只剩下一个。


kruscal算法的模板代码如下:

 1 const int maxn=400;//最大点数
 2 const int maxm=10000;//最大边数
 3 int n,m;//n表示点数,m表示边数
 4 struct edge{int u,v,w;} e[maxm];//u,v,w分别表示该边的两个顶点和权值
 5 bool cmp(edge a,edge b)
 6 {
 7     return a.w<b.w;
 8 }
 9 int fa[maxn];//因为需要用到并查集来判断两个顶点是否属于同一个连通块
10 int find(int x)
11 {
12     if(x==fa[x]) return x;
13     else return fa[x]=find(fa[x]);
14 }
15 int kruscal()
16 {
17     int ans=-1;
18     sort(e+1,e+1+m,cmp);
19     for(int i=1;i<=n;++i) fa[i]=i;//初始化并查集
20     int cnt=n;
21     for(int i=1;i<=m;++i)
22     {
23         int t1=find(e[i].u);
24         int t2=find(e[i].v);
25         if(t1!=t2)
26         {
27             if(cnt==1) break;
28             fa[t1]=t2;
29             ans=max(ans,e[i].w);
30             cnt--;
31         }
32     }
33     return ans;
34 }

针对这道题,我们只需要把ans+=e[i].w改为ans=max(ans,e[i].w)就好了,至此问题得到了解决。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=400;///最大点数
 4 const int maxm=10000;///最大边数
 5 int n,m;///n表示点数,m表示边数
 6 struct edge
 7 {
 8     int u,v,w;///u,v,w分别表示该边的两个顶点和权值
 9 }e[maxm];
10 bool cmp(edge a,edge b)
11 {
12     return a.w<b.w;
13 }
14 int fa[maxn];///判断两个点是否属于同一个连通块
15 int find(int x)
16 {
17     if(x==fa[x])
18         return x;
19     else return fa[x]=find(fa[x]);
20 }
21 int kruscal()
22 {
23     int ans=-1;
24     sort(e+1,e+1+m,cmp);
25     for(int i=1;i<=n;i++)
26         fa[i]=i;///初始化并查集
27     int cnt=n;
28     for(int i=1;i<=m;i++)
29     {
30         int t1=find(e[i].u);
31         int t2=find(e[i].v);
32         if(t1!=t2)
33         {
34             if(cnt==1)
35                 break;
36             fa[t1]=t2;
37             ///ans+=e[i].w;
38             ans=max(ans,e[i].w);
39             cnt--;
40         }
41     }
42     return ans;
43 }
44 int main()
45 {
46     cin>>n>>m;
47     for(int i=1;i<=m;i++)
48     {
49         cin>>e[i].u>>e[i].v>>e[i].w;
50     }
51     cout<<n-1<<" ";
52     cout<<kruscal()<<endl;
53     return 0;
54 }

转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/7141078.html

BZOJ 1083: [SCOI2005]繁忙的都市【Kruscal最小生成树裸题】相关推荐

  1. bzoj 1083: [SCOI2005]繁忙的都市

    省选提?? /**************************************************************Problem: 1083User: lxy8584099La ...

  2. bzoj1083 [SCOI2005]繁忙的都市(最小生成树)

    Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道 路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路 ...

  3. 信息学奥赛一本通 1392:繁忙的都市(city) | 洛谷 P2330 [SCOI2005]繁忙的都市

    [题目链接] ybt 1392:繁忙的都市(city) 洛谷 P2330 [SCOI2005]繁忙的都市 [题目考点] 1. 图论 最小生成树 [解题思路] 将题目叙述转为图论概念,交叉路口为顶点,道 ...

  4. 【HDU - 1102】Constructing Roads (最小生成树裸题模板)

    题干: There are N villages, which are numbered from 1 to N, and you should build some roads such that ...

  5. 【OpenJ_Bailian - 1258】【POJ - 1258】Agri-Net (最小生成树裸题)

    题干: Farmer John has been elected mayor of his town! One of his campaign promises was to bring intern ...

  6. vijos P1190繁忙的都市(Kruskal)(最小生成树)

    P1190  繁忙的都市 城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉 ...

  7. CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树

    题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...

  8. [LUOGU] P2330 [SCOI2005]繁忙的都市

    题目描述城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道 ...

  9. BZOJ1083: [SCOI2005]繁忙的都市

    水题之王SP-这题就裸的最小生成树 1 /************************************************************** 2 Problem: 1083 ...

最新文章

  1. 肺部ct重建_肺部CT血管分割及三维重建
  2. 各家版本控制系统(VCS)对比:VSS、SVN、Git。代码托管平台对比:GitLab、GitHub、码云(Gitee)、SourceForge、DevCloud(华为软件开发云)
  3. Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)
  4. django css,Django表单中的CSS样式
  5. 关于小范围整数N拆解成2的幂相加的个数
  6. Shell脚本实战:日志关键字监控+自动告警
  7. c++标准程序库:STL容器之map
  8. GMapping源码分析之随手笔记
  9. 2017-01-20_dp测试
  10. Office 365中的密码过期策略
  11. 软考—软件设计师(中级)第5版
  12. 【随笔】Linux drop_caches
  13. 自学c语言要下载什么软件下载,你学c语言用的什么app?
  14. Autoit 打开文件的几种方式(run/Fileopen/ShellExecute)
  15. uniapp更改switch大小
  16. Android远程桌面助手(B1309)
  17. [DEFCON全球黑客大会] 针对CTF,大家都是怎么训练的?
  18. 微信小程序云开发联表查询【聚合】
  19. 没有音响,把手机当作电脑音响的操作。
  20. Android界面美化的一点点积累

热门文章

  1. android代码清除锁屏密码,清除Android手机锁屏密码的三个小妙招
  2. java中unicode显示乱码_Java 已知Java系统编码是GBK,jtextarea从一编码为Unicode的文本中读取数据,出现乱码,怎么正常显示?...
  3. python列表常用の操作
  4. Java反射 Constructor类
  5. opencv方框内图像保存_opencv::将两幅图像合并后,在同一个窗口显示;并将合并的图像流保存成视频文件...
  6. python优化网站_[练习] 用PYTHON来优化网站中的图片
  7. java note项目_Java Request.setNote方法代码示例
  8. oracle 两表两列数据对比_Oracle、PostgreSQL与Mysql数据写入性能对比
  9. java 上传 进度,关于 javaweb的文件上传实时显示进度
  10. Jsoup从元素中抽取属性 文本和HTML