POJ3522差值最小的生成树
2012-07-07 21:47
323 查看
/* 对于固定最小边的生成树中,用Kruskal得到的最小生成树一定是最大边-最小边的差值最小的生成树,从而枚举最小边进行Kruskal得到的差值最小的一个就是答案,数据小,很好过,不用多少优化 */ #include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int NN=102; const int MM=50000; const int INF=0x3fffffff; int n,m; struct Edge{ int u,v,w; }e[MM]; int cmp(const void *a,const void *b) { Edge *c=(Edge *)a; Edge *d=(Edge *)b; return c->w-d->w; } int p[NN]; int pp(int x) { if (p[x]!=x) p[x]=pp(p[x]); return p[x]; } int Kruskal(int t) { int i,cnt=0; for (i=1; i<=n; i++) p[i]=i; for (i=t; i<m; i++) { if (pp(e[i].u)==pp(e[i].v)) continue; p[pp(e[i].v)]=pp(e[i].u); if (++cnt==n-1) break; } if (cnt<n-1) return -1; return e[i].w-e[t].w; } int main() { while (scanf("%d%d",&n,&m),n|m) { for (int i=0; i<m; i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); qsort(e,m,sizeof(Edge),cmp); int tmp,ans=INF; for (int i=0; i<=m-n+1; i++) { tmp=Kruskal(i); if (tmp==-1) break; if (tmp<ans) ans=tmp; } if (ans==INF) printf("-1\n"); else printf("%d\n",ans); } return 0; }
相关文章推荐
- poj3522(求最大边最小边差值最小的生成树)
- 【poj3522-苗条树】最大边与最小边差值最小的生成树,并查集
- POJ 3522 最大边与最小边差值最小的生成树
- POJ3522 SlimSpan 最大边和最小边的差最小的生成树
- Slim Span 求一颗生成树 使得最大边与最小边的差值最小
- poj3522 Slim Span 最长边与最短边差值最小的生成树,kruskal算法 + 暴力枚举
- NOIP 边权差值最小的生成树(小数据)
- POJ 3522 最大边与最小边差值最小的生成树(最小生成树的性质)
- PKU3522(Slim Span)-求差值最小的生成树
- Poj 3522 最长边与最短边差值最小的生成树
- POJ3522Slim Span(最大边与最小边差值最小的生成树)
- 两个数组,交互他们之间的数据,使得他们之间的差值最小
- poj 3522 Slim Span 最大边减最小边最小的生成树
- 将一个数组划分为和差值最小的子数组
- 最小及次小生成树
- 阿里14笔试题-求一个二叉树最大值和最小值的差值绝对值
- C++数据结构之最小生成树
- POJ3522 Slim Span(最小生成树,Kruakal)
- 最小差值
- 编写一个函数 返回数组中最大值与最小值的差值