poj 3763:Slim Span
来源:互联网 发布:沪昆高铁偷工减料知乎 编辑:程序博客网 时间:2024/06/05 16:02
题目链接:
点击打开链接
题意:给出一个n(n<=100)结点的图,求苗条度(最大边减最小边的值)尽量小的生成树,输出这个值。
分析:根据Kruskal算法,我们可以枚举最小边权,然后求最小生成树,就可以暴力算出最大边权减去最小边权的最小值。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define inf 0x7f7f7f7fstruct node{int st,en,len;}E[10000];int fa[10000];int maxx,minn,min1,n,m;int find(int x){if(x==fa[x]) return fa[x];else return fa[x]=find(fa[x]);}bool cmp(node a,node b){return a.len <b.len;}int kruskal(int p){int i,j=1;for(i=1;i<=n;i++)fa[i]=i;maxx=0;minn=E[p].len;for(i=p;i<=m;i++){int x=find(E[i].st),y=find(E[i].en);if(x!=y){maxx=max(maxx,E[i].len);fa[x]=y;}}int t=find(1); for(i=2;i<=n;i++) { if(find(i)!=t) {j=0;break; } } if(j==0) return -1;else return maxx-minn;}int main(){int i,j,temp,flag=0;while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0) break;min1=inf;for(i=1;i<=m;i++)scanf("%d%d%d",&E[i].st,&E[i].en,&E[i].len);sort(E+1,E+m+1,cmp);for(i=1;i<=m-n+2;i++)///因为最小生成树边数为n-1,那么少于n-1条边肯定没有最小生成树{temp=kruskal(i);if(temp!=-1){min1=min(temp,min1);flag=1;}}if(min1>=inf) flag=0;if(!flag) printf("-1\n");else printf("%d\n",min1);}return 0;}
0 0
- poj 3763:Slim Span
- poj 3763 Slim Span(变式Kruskal)
- POJ 3522 Slim Span
- poj 3522 Slim Span
- POJ 3522 Slim Span
- poj 3522 Slim Span
- poj 3522 Slim Span
- poj 3522 Slim Span
- poj 3522 Slim Span
- POJ 3522 Slim Span
- poj 3522 Slim Span
- POJ 3522 Slim Span
- poj 3522 Slim Span
- poj 3522 Slim Span
- POJ 3522 Slim Span
- POJ 3522 Slim Span
- poj slim span
- poj 3522 Slim Span
- java动态代理(JDK和cglib)
- 进击的KFC:UI(十)UITableView的编辑和移动
- iOS开发网络篇
- iOS网络-05-AFNetwoking原理及常用操作
- Spring事务传播行为和隔离机制
- poj 3763:Slim Span
- Unity5中的光照简介
- codelity--MaxProductOfThree
- 嵌入式Linux学习地址
- hdu 5567
- 使用python对url编码解码
- 关系型数据库的理解
- 签到题
- 解决virtualbox只能安装32bit的问题