poj 3522【Slim Span】
2012-09-02 12:29
92 查看
题意:给你一个无向图,没有重边,没有自环,要你求该图中一颗生成树,但是这个生成树的最大边与最小边的差值要最小。
如果固定一个最小边,求得最小生成树后,最大边也就知道了,其实这个也意味着在固定最小边的情况下最小生成树的最大边是固定的,可是为什么我们一定要求最小生成树呢,因为其他的生成树的最大边与最小边的差值要大于等于最小生成树的大小边之差,这个的原因大家可以自己仔细想想最小生成树的性质和次小生成树的求法(枚举每条最小生成树上的边,不要此条边求得的生成树,选最小一个就是了,这个就意味着次小生成树里面肯定有一条边要比最小生成树的大,其它的相同)。这样说来的话,我们只需将边排好序后,枚举每条边,并用Krustral求得最小生成树就可以了……(参考:http://blog.csdn.net/sdj222555/article/details/7698978)
View Code
如果固定一个最小边,求得最小生成树后,最大边也就知道了,其实这个也意味着在固定最小边的情况下最小生成树的最大边是固定的,可是为什么我们一定要求最小生成树呢,因为其他的生成树的最大边与最小边的差值要大于等于最小生成树的大小边之差,这个的原因大家可以自己仔细想想最小生成树的性质和次小生成树的求法(枚举每条最小生成树上的边,不要此条边求得的生成树,选最小一个就是了,这个就意味着次小生成树里面肯定有一条边要比最小生成树的大,其它的相同)。这样说来的话,我们只需将边排好序后,枚举每条边,并用Krustral求得最小生成树就可以了……(参考:http://blog.csdn.net/sdj222555/article/details/7698978)
View Code
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; struct node { int x,y; int w; }edge[10000]; int father[110]; int n,m; bool cmp(const node& a,const node& b) { return a.w < b.w; } int find(int x) { return father[x] = (x == father[x]?x:(find(father[x]))); } int Krustral(int x) { int num = 0; int ans = -1; for(int i = x;i < m;i ++) { int fa = find(edge[i].x); int fb = find(edge[i].y); if(fa == fb) { continue; } father[fa] = fb; num ++; if(num == n-1) { ans = edge[i].w; break; } } return ans; } int main() { //freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); while(cin >> n >> m,n||m) { for(int i = 0;i < m;i ++) { cin >> edge[i].x >> edge[i].y >> edge[i].w; } if(m < n - 1) { cout << "-1" << endl; continue; } sort(edge,edge+m,cmp); int minn = -1; for(int i = 0;i <= m - n + 1;i ++) { for(int j = 1;j <= n;j ++) { father[j] = j; } int ans = Krustral(i); if(ans != -1) { if(minn == -1 || minn > ans - edge[i].w) { minn = ans - edge[i].w; } } } cout << minn << endl; } return 0; }
相关文章推荐
- poj 3522 Slim Span(Kruskal+枚举)
- poj 3522 Slim Span(最小生成树)kruskal算法
- poj 3522 Slim Span(最小生成树 Kruskal算法)
- POJ 3522 Slim Span【枚举+克鲁斯卡尔求最小生成树】
- Slim Span POJ - 3522 最小生成树最大边和最小边之差最小
- POJ 3522 Slim Span (Kruskal+枚举)
- POJ 3522 Slim Span (最小生成树)
- POJ 3522 Slim Span(kruskal 变型)
- poj 3522 Slim Span(Kruskal+枚举)
- POJ 3522 Slim Span MST变形
- poj 3522 Slim Span(Kruskal+枚举)
- POJ - 3522 Slim Span (kruskal+枚举)
- POJ 3522 Slim Span(生成树+克鲁斯卡尔)
- Slim Span POJ - 3522 题解
- poj 3522 Slim Span(Kruskal+枚举)
- POJ 3522 Slim Span 暴力枚举 + 并查集
- POJ 3522 Slim Span(最小差值生成树)
- POJ 3522 Slim Span 生成树
- POJ 3522 Slim Span(最小生成树)
- POJ 3522 Slim Span 并查集