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算法的模板代码如下:

 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最小生成树裸题】的更多相关文章

  1. BZOJ 1083 [SCOI2005]繁忙的都市 (最小生成树裸题无重边) 超简单写法!!

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

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

    Bzoj 1083: [SCOI2005]繁忙的都市 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1083 此题是最小瓶颈生成树的裸题. ...

  3. BZOJ 1083: [SCOI2005]繁忙的都市 kruskal

    1083: [SCOI2005]繁忙的都市 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1083 Description 城市C是一个非 ...

  4. BZOJ 1083: [SCOI2005]繁忙的都市(MST)

    裸的最小生成树..直接跑就行了 ---------------------------------------------------------------------- #include<c ...

  5. BZOJ 1083 [SCOI2005]繁忙的都市

    1083: [SCOI2005]繁忙的都市 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1664  Solved: 1080[Submit][Sta ...

  6. bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1083 思路:连接所有点,肯定最少是需要n-1条边的,也就是写个最小生成树,记得保存下最大的权 ...

  7. BZOJ 1083: [SCOI2005]繁忙的都市 裸的最小生成树

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1083 代码: #include<iostream> #include< ...

  8. 1083. [SCOI2005]繁忙的都市【最小生成树】

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

  9. 【BZOJ1083】[SCOI2005]繁忙的都市(最小生成树)

    [BZOJ1083][SCOI2005]繁忙的都市(最小生成树) 题面 BZOJ 洛谷 题解 模板题. #include<iostream> #include<cstdio> ...

随机推荐

  1. mysql-5.7.17.msi安装

    mysql-5.7.17.msi安装,跟着截图摩擦,一步一步是爪牙,是魔鬼的步伐 开始: 可以创建其他用户 我自己改了日志名

  2. 如果没有UX经验,如何创建个人UX作品集?

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 一直以来,这是设计行业的悖论. 当今,许多活跃于我们用户体验行业的专业人士在开始个人职业生涯时都面临 ...

  3. nova创建虚拟机源码分析系列之一 restful api

    开始学习openstack源码,源码文件多,分支不少.按照学习的方法走通一条线是最好的,而网上推荐的最多的就是nova创建虚机的过程.从这一条线入手,能够贯穿openstack核心服务.写博文仅做学习 ...

  4. 从底层角度看ASP.NET-A low-level Look at the ASP.NET...

    从更低的角度 这篇文章在一个底层的角度来关注一个web请求怎样到达asp.net框架,从web服务器,通过ISAPI.看看这些后面发生了什么,让我们停止对asp.net的黑箱猜想.ASP.NET是一个 ...

  5. RedisPool操作Redis,工具类实例

    redis.properties 配置文件内容 redis.pool.maxActive=100redis.pool.maxIdle=20redis.pool.maxWait=3000redis.po ...

  6. flask 分页

    在我们学习的过程中会遇到这么样的问题,就是在我们学习的过程中会发现需要分页处理,这里呢,给大家介绍书上说的分页. @app.route('/',methods=['GET']) @app.route( ...

  7. 论文笔记-Squeeze-and-Excitation Networks

    作者提出为了增强网络的表达能力,现有的工作显示了加强空间编码的作用.在这篇论文里面,作者重点关注channel上的信息,提出了"Squeeze-and-Excitation"(SE ...

  8. KMP 算法 C++

    #include <iostream>#include<string.h>#include<stdio.h>using namespace std; void Co ...

  9. 封装简单的equery

    /** * Created by wang on 2016/3/23. */ //绑定操作 function bindEvent(obj,events,fn){ if (obj.addEventLis ...

  10. 微信小程序之页面路由

    路由方式 简介 对于路由的触发方式以及页面生命周期函数如下: 路由方式 触发时机 路由前页面 路由后页面 初始化 小程序打开的第一个页面   onLoad, onSHow 打开新页面 调用 API w ...