Uva1395——Slim Span
2016-03-12 14:20
369 查看
这题,最小生成树的应用,只是需要稍微变形一下。
输入结点数为n,边数为m,对每条边进行从小到大排序,然后枚举枚举每一条边,从该边起到最后这些边中求最小生成树并找到权值最大的边。不断的更新最大权值与枚举的边的差值。
代码:
输入结点数为n,边数为m,对每条边进行从小到大排序,然后枚举枚举每一条边,从该边起到最后这些边中求最小生成树并找到权值最大的边。不断的更新最大权值与枚举的边的差值。
代码:
#include <iostream> #include <algorithm> using namespace std; const int maxn = 110; int m, n; int maxnt; int p[maxn]; struct node { int x, y, d; }data[5010]; int cmp(node x, node y) { return x.d < y.d; } int finds(int x) { return p[x] == x ? x : p[x] = finds(p[x]); } bool krus(int k) { int i, count = 0; maxnt = -1; for(i = 0; i <= n; i++) p[i] = i; for(i = k; i < m; i++) { int fx = finds(data[i].x); int fy = finds(data[i].y); if(fx != fy) { p[fy] = fx; if(maxnt < data[i].d) maxnt = data[i].d; if(++count == n - 1) return true; } } return false; } int main() { // freopen("1.txt", "r", stdin); int i, j; while(cin >> n >> m) { if(m == 0 && n == 0) break; for(i = 0; i < m; i++) cin >> data[i].x >> data[i].y >> data[i].d; sort(data, data + m, cmp); int ans = 0xfffffff; for(j = 0; j < m; j++) { if(krus(j)) { if(ans > maxnt - data[j].d) ans = maxnt - data[j].d; } } if(ans == 0xfffffff) cout << -1 << endl; else cout << ans << endl; } return 0; }
相关文章推荐
- JavaScript中操作有些DOM时关于文本节点和元素节点的问题。
- 笔记:第1章 计算机系统漫游
- iOS 属性学习笔记
- 图片二次采样
- java常用代码(不定时更新)
- MyBatis插入时候获取自增主键方法
- 对酷狗音乐的评价
- Web存储——IndexedDB的使用(二)
- hdu 1011 Tempter of the Bone【DFS+奇偶性剪枝】
- FFMPEG库引用的顺序在GCC编译时还有影响
- Windows 驱动开发 - 5
- 关于开源中国的代码托管
- Qt之鼠标随手画及画多边形
- 概念理解
- 【opencv】大津法二值化
- 高效的斐波那契数列实现
- jQuery(一)
- Java开发必会的Linux命令
- git 常用命令--详述
- ahu-557容斥原理