苗条的生成树(uva 1395)
2018-02-04 19:36
225 查看
题目链接 https://vjudge.net/problem/UVA-1395
题意
给出一个n个结点(n<=100)的图,求苗条度尽量小的生成树
思路
把边权从小到大排序,对于一个连续子区间[L,R],如果能使这n个点联通,那就一定存在一个苗条度不超过W[R]-W[L]的生成树,二重循环枚举即可
题意
给出一个n个结点(n<=100)的图,求苗条度尽量小的生成树
思路
把边权从小到大排序,对于一个连续子区间[L,R],如果能使这n个点联通,那就一定存在一个苗条度不超过W[R]-W[L]的生成树,二重循环枚举即可
#include<bits/stdc++.h> using namespace std; const int maxn = 105; const int maxm = 5050; int n, m; int par[maxn]; struct Edge { int from, to, dist; }edges[maxm]; bool cmp(Edge x, Edge y) { return x.dist < y.dist; } int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); } int main() { while (scanf("%d%d", &n, &m) == 2) { if (!n && !m) break; for (int i = 0; i < m; ++i) scanf("%d%d%d", &edges[i].from, &edges[i].to, &edges[i].dist); sort(edges, edges + m, cmp); int ans = -1; for (int i = 0; i < m; ++i) { for (int x = 0; x <= n; ++x) par[x] = x; int num = 0; for (int j = i; j < m; ++j) { Edge e = edges[j]; int x = find(e.from); int y = find(e.to); if (x != y) { par[x] = y; ++num; if (num == n - 1) { if (-1 == ans) ans = edges[j].dist - edges[i].dist; else ans = min(ans, edges[j].dist - edges[i].dist); } } } } printf("%d\n", ans); } return 0; }
相关文章推荐
- UVA1395 苗条的生成树
- UVA 1395 Slim Span--苗条的生成树(并查集+枚举)
- 例题11-2 苗条的生成树 UVa1395
- UVa 1395 苗条的生成树(Kruskal+并查集)
- (UVa 1395)Slim Span (苗条的生成树)(并查集+Kruskal)
- UVA1395 苗条的生成树/连续递增子序列(?)/克鲁斯卡尔
- 例题11-2 苗条的生成树 UVa1395 Kruskal算法样例(基于并查集,which is almost like set)
- 例题11-2 UVA - 1395 Slim Span 苗条的生成树(Kruscal最小生成树)
- uva 1395 苗条的生成树(最小生成树入门)
- UVa1395图论之最小生成树
- 最小生成树(苗条生成树 uva 1395)
- 【UVA 1395】 Slim Span (苗条树)
- 11.2.2 例题 11-2 UVA 1395 Slim Span (最大值-最小值尽可能小的生成树)
- 苗条的生长树slim span,uva1395——最小生成树,kruskal
- UVa 1395 Slim Span (最小生成树)
- Uva 10462 Is There A Second Way Left? (次小生成树)
- UVaLive/LA 6807 Túnel de Rata(最大生成树)
- uvaLive5713 次小生成树
- UVA 1395 Kruskal算法
- uva-1395