【题目链接】

ybt 1392:繁忙的都市(city)
洛谷 P2330 [SCOI2005]繁忙的都市

【题目考点】

1. 图论 最小生成树

【解题思路】

将题目叙述转为图论概念,交叉路口为顶点,道路为边,道路是双向的,且所有交叉路口都直接或间接连接起来,说明这是无向连通图。每条道路的分值,就是边的权值。政府要改造一些道路,就是选一些边。
三个要求的概念分别为:

  1. 选择的边构成的图应该是连通图,且应该包含原图所有顶点。
  2. 选择的边尽可能少。
    边最少时,该图就成了无根树。边数为顶点数减1。
    综合以上两点,选择的边及顶点构成的图就是原图的生成树。
  3. 生成树有多种方案,选择其中权值最大的边最小的那一种生成树方案,即瓶颈生成树。

树上最大边权值在图的所有生成树中最小的生成树,叫做瓶颈生成树。
最小生成树一定是瓶颈生成树,但瓶颈生成树未必是最小生成树。(其证明见百度百科)

题目要求的就是瓶颈生成树,我们可以直接求出最小生成树,它一定是瓶颈生成树。
该题顶点数<=300,边数<=100000,使用Prim,Prim堆优化,Kruskal都可以完成该题。

【题解代码】

解法1:朴素Prim算法

#include<bits/stdc++.h>
using namespace std;
#define N 305
struct Edge
{int t, w;Edge(){}Edge(int a, int b):t(a),w(b){};
};
vector<Edge> edge[N];
bool vis[N];
int n, m, mx;
int dis[N];
void initGraph()
{int f, t, w;cin >> n >> m;for(int i = 1; i <= m; ++i){cin >> f >> t >> w;edge[f].push_back(Edge(t, w));edge[t].push_back(Edge(f, w));}
}
void prim()
{memset(dis, 0x3f, sizeof(dis));dis[1] = 0;for(int k = 1; k <= n; ++k){int u = 0;for(int i = 1; i <= n; ++i){if(vis[i] == false && (u == 0 || dis[i] < dis[u]))u = i;}vis[u] = true;mx = max(mx, dis[u]);for(int i = 0; i < edge[u].size(); ++i){int v = edge[u][i].t, w = edge[u][i].w;if(vis[v] == false && dis[v] > w)dis[v] = w;}}
}
int main()
{initGraph();prim();cout << n-1 << ' ' << mx;return 0;
}

解法2:Prim算法堆优化

#include<bits/stdc++.h>
using namespace std;
#define N 305
struct Pair
{int v, d;Pair(){}Pair(int a, int b):v(a),d(b){}bool operator < (const Pair &b) const{return b.d < d;}
};
struct Edge
{int t, w;Edge(){}Edge(int a, int b):t(a),w(b){};
};
vector<Edge> edge[N];
bool vis[N];
int n, m, mx;
int dis[N];
void initGraph()
{int f, t, w;cin >> n >> m;for(int i = 1; i <= m; ++i){cin >> f >> t >> w;edge[f].push_back(Edge(t, w));edge[t].push_back(Edge(f, w));}
}
void prim()
{memset(dis, 0x3f, sizeof(dis));priority_queue<Pair> pq;pq.push(Pair(1, 0));dis[1] = 0;while(pq.empty() == false){int u = pq.top().v;pq.pop();if(vis[u])continue;vis[u] = true;mx = max(mx, dis[u]);for(int i = 0; i < edge[u].size(); ++i){int v = edge[u][i].t, w = edge[u][i].w;if(vis[v] == false && dis[v] > w){dis[v] = w;pq.push(Pair(v, dis[v]));}}}
}
int main()
{initGraph();prim();cout << n-1 << ' ' << mx;return 0;
}

解法2:Kruskal算法

#include<bits/stdc++.h>
using namespace std;
#define N 305
struct Edge
{int f, t, w;Edge(){}Edge(int a, int b, int c):f(a),t(b),w(c){};bool operator < (const Edge &b) const{return w < b.w;}
};
vector<Edge> edges;
bool vis[N];
int fa[N];
int n, m, mx, en;
void initFa()
{for(int i = 1; i <= n; ++i)fa[i] = i;
}
int find(int x)
{return x == fa[x] ? x : (fa[x] = find(fa[x]));
}
void merge(int x, int y)
{fa[find(x)] = find(y);
}
void init()
{int f, t, w;cin >> n >> m;for(int i = 1; i <= m; ++i){cin >> f >> t >> w;edges.push_back(Edge(f, t, w));}
}
void kruskal()
{sort(edges.begin(), edges.end());for(int i = 0; i < edges.size(); ++i){int f = edges[i].f, t = edges[i].t, w = edges[i].w;if(find(f) != find(t)){merge(f, t);mx = max(mx, w);if(++en == n - 1)break;}}
}
int main()
{init();initFa();kruskal();cout << n-1 << ' ' << mx;return 0;
}

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

  1. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

  2. 信息学奥赛一本通 (C++)上机练习

    信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...

  3. 信息学奥赛一本通(C++版)NOIP提高组(1820-1829)

    信息学奥赛一本通(C++版)NOIP提高组目录 //1820 [题目描述] 我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所 处位置的(值减1)为指数,以10为底数的幂之和的 ...

  4. 信息学奥赛一本通_长乐一中老师演绎“奥赛传奇”

    董永建(右一)在课堂上. 台海网5月14日讯 据福州晚报报道,长乐一中有一位"传奇"老师--15年来,他辅导的学生在全国高中生信息学奥赛中获金牌3人次.银牌3人次.铜牌5人次:在全 ...

  5. 信息学奥赛一本通 提高篇 第5章 矩阵乘法

    例1 矩阵AXB 信息学奥赛一本通(C++版)在线评测系统 [矩阵乘法]矩阵A×B_Uletay-CSDN博客 矩阵乘法--矩阵A×B_vina的博客-CSDN博客 一本通1641[例 1]矩阵 A× ...

  6. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  7. 《信息学奥赛一本通 提高篇》

    提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...

  8. 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分

    信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...

  9. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

最新文章

  1. mysql查看表格的列信息
  2. dubbo总结——dubbo的使用场景
  3. oracle jdedward,Oracle JDEdwards EnterpriseOne Tools任意文件上传漏洞(CVE-2011-2317)
  4. a byte of python中文版_面试官问 Python 版 “垃圾回收”机制,我没答上来
  5. 平衡二叉树、二叉排序树-数据结构
  6. 九号机器人田奇峰_九号公司成功登陆科创板
  7. 第一百七十四天 how can i 坚持
  8. [Lisp]slime
  9. python按键盘上哪个键运行_python按什么键运行
  10. PHP字符编码绕过漏洞总结
  11. 联想服务器如何u盘安装系统教程,联想lenovo u盘安装Windows 7系统操作步骤详解
  12. python全栈开发工程师_老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)...
  13. LTE FDD 时频资源
  14. 【论文解读--Xdog】(宇树科技鼻祖)新型电驱式四足机器人研制与测试
  15. 总结--linux常用配置文件总结
  16. python几何拼贴画_什么是拼贴艺术、集合艺术、拼贴画?
  17. 梦幻西游ps计算机,五开选择PS与NE:那是因为效率高的缘故
  18. left join 多表关联查询
  19. 结构健康监测平台发展现状
  20. CSS 里的min-width/max-width和min-height/max-height

热门文章

  1. Linux忘记root密码怎么办?
  2. 云开发听说过没? Compilr 屌爆的在线开发工具 -_-#
  3. 密码学二次剩余困难性问题The Quadratic Residuosity Problem
  4. 线性动态电路的复频域分析
  5. LwIP之协议栈接口
  6. 本地计算机上的mysql服务怎么注册,本地计算机上的mysql服务启动后中止
  7. 国内开源项目无法形成气候且难以持续性的问题分析
  8. 再见 Jenkins !几行脚本搞定自动化部署,这款神器有点厉害!
  9. 聊聊自己的高效学习方法~
  10. 系统“烂”怎么办?请看资深专家拆分改造实践