UVA - 1395 - Slim Span(Kruskal算法+枚举)
2016-06-13 00:22
459 查看
将边按权值排序后,枚举最小权值的边,
从第一个边开始,直到往后能够构成生成树,并且记录中间出现过的最大权值和最小权值,
最后不断取最小值即可
切记每次枚举前,都要初始化父亲节点
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<list>
typedef long long ll;
typedef unsigned long long llu;
const int MAXN = 100 + 10;
const int MAXT = 100000 + 10;
const int INF = 0x7f7f7f7f;
const double pi = acos(-1.0);
const double EPS = 1e-6;
using namespace std;
struct Line{
int be, en, v;
Line() : be(0), en(0), v(0) {}
bool operator < (const Line &b) const{
return v < b.v;
}
}p[MAXT];
int fa[MAXN], n, m;
int find(int v){
return fa[v] = fa[v] == v ? v : find(fa[v]);
}
int init(){
for(int i = 0; i <= n; ++i) fa[i] = i;
}
int main(){
while(scanf("%d%d", &n, &m) == 2 && (n || m)){
for(int i = 0; i < m; ++i) scanf("%d%d%d", &p[i].be, &p[i].en, &p[i].v);
sort(p, p + m);
int ans = INF;
for(int i = 0; i < m; ++i){
int tmp = 0, cnt = n, ma = -1, mi = INF;
init();
for(int j = i; j < m; ++j){
int t1 = find(p[j].be);
int t2 = find(p[j].en);
if(t1 != t2){
fa[t1] = t2;
ma = max(ma, p[j].v);
mi = min(mi, p[j].v);
if(--cnt == 1) break;
}
}
if(cnt == 1) ans = min(ans, ma - mi);
else break;
}
printf("%d\n", ans == INF ? -1 : ans);
}
return 0;
}
从第一个边开始,直到往后能够构成生成树,并且记录中间出现过的最大权值和最小权值,
最后不断取最小值即可
切记每次枚举前,都要初始化父亲节点
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<list>
typedef long long ll;
typedef unsigned long long llu;
const int MAXN = 100 + 10;
const int MAXT = 100000 + 10;
const int INF = 0x7f7f7f7f;
const double pi = acos(-1.0);
const double EPS = 1e-6;
using namespace std;
struct Line{
int be, en, v;
Line() : be(0), en(0), v(0) {}
bool operator < (const Line &b) const{
return v < b.v;
}
}p[MAXT];
int fa[MAXN], n, m;
int find(int v){
return fa[v] = fa[v] == v ? v : find(fa[v]);
}
int init(){
for(int i = 0; i <= n; ++i) fa[i] = i;
}
int main(){
while(scanf("%d%d", &n, &m) == 2 && (n || m)){
for(int i = 0; i < m; ++i) scanf("%d%d%d", &p[i].be, &p[i].en, &p[i].v);
sort(p, p + m);
int ans = INF;
for(int i = 0; i < m; ++i){
int tmp = 0, cnt = n, ma = -1, mi = INF;
init();
for(int j = i; j < m; ++j){
int t1 = find(p[j].be);
int t2 = find(p[j].en);
if(t1 != t2){
fa[t1] = t2;
ma = max(ma, p[j].v);
mi = min(mi, p[j].v);
if(--cnt == 1) break;
}
}
if(cnt == 1) ans = min(ans, ma - mi);
else break;
}
printf("%d\n", ans == INF ? -1 : ans);
}
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)