UVa 1395 (最小生成树) Slim Span

题意:

规定一棵生成树的苗条度为:最大权值与最小权值之差。给出一个n个顶点m条边的图,求苗条度最小的生成树。

分析:

按照边的权值排序,枚举边集的连续区间[L, R]的左边界L,如果这些区间刚好满足一个生成树,则存在一个苗条度不超过W[R] - W[L]的生成树。

话说,代码中用了STL的vector,慢了很多。

 1 #include <cstdio>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 const int INF = 1000000000;
 7 const int maxn = 100 + 10;
 8 int pa[maxn];
 9
10 int findset(int x) { return x == pa[x] ? x : pa[x] = findset(pa[x]); }
11
12 struct Edge
13 {
14     int u, v, w;
15     Edge(int u, int v, int w):u(u), v(v), w(w) {}
16     bool operator < (const Edge& rhs) const
17     {
18         return w < rhs.w;
19     }
20 };
21
22 vector<Edge> G;
23
24 int main()
25 {
26     //freopen("in.txt", "r", stdin);
27     int n, m;
28     while(scanf("%d%d", &n, &m) == 2 && n)
29     {
30         G.clear();
31         int u, v, w;
32         for(int i = 0; i < m; ++i)
33         {
34             scanf("%d%d%d", &u, &v, &w);
35             G.push_back(Edge(u, v, w));
36         }
37         sort(G.begin(), G.end());
38         int ans = INF;
39         for(int L = 0; L <= m - n + 1; ++L)
40         {
41             for(int i = 1; i <= n; ++i) pa[i] = i;
42             int cnt = n;
43             for(int R = L; R < m; ++R)
44             {
45                 int u = findset(G[R].u), v = findset(G[R].v);
46                 if(u != v)
47                 {
48                     pa[u] = v;
49                     if(--cnt == 1) { ans = min(ans, G[R].w - G[L].w); }
50                 }
51             }
52         }
53         if(ans == INF) ans = -1;
54
55         printf("%d\n", ans);
56     }
57
58     return 0;
59 }

代码君

时间: 2024-10-25 07:31:08

UVa 1395 (最小生成树) Slim Span的相关文章

[2016-01-27][UVA][1395][D -?Slim Span]

[2016-01-27][UVA][1395][D - Slim Span] 时间:2016-01-21  11:06:30  星期四 题目编号:UVA 1395 题目大意:求所有生成树 最大边和最小边之差的最小值 分析: 想法是枚举所有边,但是分析之后发现可以不用枚举所有的树 已知krukal得到的最小生成树得到的最小生成树,最大边最小 也就是说,这个最大边,就是使得 最大边和最小边 差值最大的边 那么,只需要求每条边的对应的差值最小的最大边即可 方法: 从最小的边开始跑生成树,然后跑krus

【UVA 1395】 Slim Span (苗条树)

[题意] 求一颗生成树,满足最大边和最小边之差最小 InputThe input consists of multiple datasets, followed by a line containing two zeros separated by a space.Each dataset has the following format.n ma1 b1 w1...am bm wmEvery input item in a dataset is a non-negative integer.

UVA 1395 Slim Span

题意: 要求的是所有生成树中最大边与最小边差值最小的那个. 分析: 其实可以利用最小瓶颈生成树,就是最小生成树这一性质,枚举原图的最小边,然后找相应生成树的最大边 代码: #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> using namespace std; const int maxn=110; co

UVA 1395 - Slim Span(MST)

UVA 1395 - Slim Span 题目链接 题意:给定一些结点和边,要求出最苗条度最小的生成树,苗条度定义为:生成树中最大权的边减去最小权的边的值 思路:类似建最小生成树的算法,多一步枚举起始边即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; const int INF = 0x3f3f3f3f; int

POJ 3522 ——Slim Span——————【最小生成树、最大边与最小边最小】

Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7102   Accepted: 3761 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V 

POJ 3522 Slim Span【枚举+克鲁斯卡尔求最小生成树】

Slim Span Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7365 Accepted: 3909 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V is a

POJ-3522 Slim Span(最小生成树)

Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8633   Accepted: 4608 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V 

UVA1395 Slim Span(kruskal)

题目:Slim Span UVA 1395 题意:给出一副无向有权图,求生成树中最小的苗条度(最大权值减最小权值),如果不能生成树,就输出-1: 思路:将所有的边按权值有小到大排序,然后枚举每一条边,以这条边开始利用Kruskal算法生成树,生成过程中求出权值的最大值,这个最大值减去当前枚举的边的权值就是苗条度,再动态维护一下最小苗条度就可以了. #include <iostream> #include <algorithm> #include <queue> #inc

POJ3522 Slim Span

Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7462   Accepted: 3959 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V