UVA 1395 Slim Span(生成树)
2016-04-16 12:06
246 查看
题意:给一个n结点的图,求最大边减去最小边尽量小的生成树
思路:首先把边的权值从小到大排序,对于一个连续的区间[L,R],如果这些边使得n个结点连通,则一定存在一个苗条度不超过W[R]-W[L]的生成树,那么可以从小到大枚举L,对于每个L,从小到大枚举R
思路:首先把边的权值从小到大排序,对于一个连续的区间[L,R],如果这些边使得n个结点连通,则一定存在一个苗条度不超过W[R]-W[L]的生成树,那么可以从小到大枚举L,对于每个L,从小到大枚举R
#include<bits/stdc++.h> using namespace std; const int maxn = 100+10; const int maxm = 10000+10; #define INF 1e9 struct Edge { int u,v,dist; Edge(){} Edge(int u,int v,int dist):u(u),v(v),dist(dist){} bool operator<(const Edge&rhs)const { return dist < rhs.dist; } }; int fa[maxn]; Edge e[maxm]; int findset(int x) { return fa[x]==-1?x:fa[x]=findset(fa[x]); } int main() { int n,m; while (scanf("%d%d",&n,&m)!=EOF && (n||m)) { for (int i = 1;i<=m;i++) { int u,v,d; scanf("%d%d%d",&u,&v,&d); e[i]=Edge(u,v,d); } sort(e+1,e+m+1); int ans = INF; for (int L=1;L<=m;L++) { int sum = 0; memset(fa,-1,sizeof(fa)); for (int R = L;R<=m;R++) { if (findset(e[R].u)!=findset(e[R].v)) { sum++; fa[findset(e[R].u)]=findset(e[R].v); } if (sum>=n-1) { ans = min(ans,e[R].dist-e[L].dist); break; } } } if (ans==INF) printf("-1\n"); else printf("%d\n",ans); } }
相关文章推荐
- Pku oj 3461 Oulipo(kmp)
- ti processor sdk linux am335x evm /bin/setup-package-install.sh hacking
- 【Unity】6.3 通过 C# 脚本创建和访问游戏对象
- c++类型转换
- 51Nod-1018-排序
- 数学题
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- * 和 ?在 shell 命令行中与在正则表达式中的区别
- ERC系统理论的提出与研发成功,是企业信息化管理史上划时代的革命
- BruteForceMatcher无法找到
- activiti自定义流程之整合(五):启动流程时获取自定义表单
- 书籍列表
- 数据库Sharding的基本思想和切分策略
- Java学习-10天
- Java 线程池原理解析(一)
- 【学习anroid编译】关于运行android模拟器
- NVI
- hihoCoder 1015 KMP算法(kmp)
- Fragment页面的切换
- JAVA修改组件