UVALive - 3887 Slim Span(枚举+二分)
2015-08-21 23:53
537 查看
题目大意:给出N个点,M条边,求出一棵包含N个点的树,且树的最大权值-最小权值 达到最小
解题思路:枚举最小边,然后依此得到生成树,这样的生成树的权值差肯定是最小的
解题思路:枚举最小边,然后依此得到生成树,这样的生成树的权值差肯定是最小的
[code]#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 110 #define M 10010 #define INF 0x3f3f3f3f struct Edge{ int u, v, c; }E[M]; int Min, Max, n, m; int f ; void init() { Min = INF; Max = -INF; for (int i = 0; i < m; i++) { scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].c); Max = max(Max, E[i].c); Min = min(Min, E[i].c); } } int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); } int judge(int mid) { for (int i = 1; i <= n; i++) f[i] = i; bool flag = false; int xx, yy, cnt = 0, Min_val, Max_val; for (int i = 0; i < m; i++) { if (E[i].c >= mid) { xx = find(E[i].u); yy = find(E[i].v); if (xx != yy) { f[xx] = yy; if (!flag) Min_val = E[i].c; flag = true; Max_val = E[i].c; cnt++; } } } if (cnt == n - 1) return Max_val - Min_val; return INF; } int cmp(const Edge &a, const Edge &b) { return a.c < b.c; } void solve() { int ans = INF; sort(E, E + m, cmp); for (int i = Min; i <= Max; i++) { ans = min(ans, judge(i)); } if (ans == INF) ans = -1; printf("%d\n", ans); } int main() { while (scanf("%d%d", &n, &m) != EOF && n + m) { init(); solve(); } return 0; }
相关文章推荐
- Android:对话框(12种:警告对话框&进度条对话框&日期对话框&时间对话框)
- MongoDB学习五--MongoDB修改数据文档
- Data transfer from GPIO port to RAM buffer using DMA upon receiving a trigger signal on the timer capture input channel.
- 黑马程序员-JAVA基础之常见API
- python笔记 2
- 软工视频总结Part One
- springmvc学习笔记(五)开启注解
- 零基础学python-7.3 字符串的一般使用
- Xposed源码剖析——Xposed初始化
- Maximal Square leetcode
- 零基础学python-7.3 字符串的一般使用
- 使用套接字的四个步骤
- HDU - 4126 Genghis Khan the Conqueror(树形DP + 最小生成树)
- yii2 数据库查询笔记
- SQL语句练习
- 以phoneGap作为承载容器是ios会上下滑动
- linux命令- 挂载命令 mount
- 关于Java关键字synchronized——单例模式的思考
- Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)
- TCP使用过程