Poj 3522 最长边与最短边差值最小的生成树
题意:
让你求一颗生成树,使得最长边和最短边长度差值最小。
思路:
额!!!感觉这个思路会超时,但是ac了,暂时没什么别的好思路,那么就先说下这个思路,大牛要是有好的思路希望能在下面留言,相互学习,我的方法是先把所有的边都按长度排序,然后枚举没一颗生成树,这样枚举能得到正确答案的原因是,如果是求最小的差值,那么最终的答案一定是在sort之后的连续的以段,我们只要枚举每一段就行了,但是这样的时间复杂度是O(M^2)的,如果碰到奇葩数据估计一组可能跑到将近1s这样就T了,呵呵。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 110
using namespace std;
typedef struct
{
int a ,b ,c;
}EDGE;
EDGE edge[N*N/2];
int mer[N];
int finds(int x)
{
return x == mer[x] ? x : mer[x] = finds(mer[x]);
}
bool camp(EDGE a ,EDGE b)
{
return a.c < b.c;
}
int main ()
{
int n ,m ,i ,j ,Ans;
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
Ans = -1;
for(i = 1 ;i <= m ;i ++)
scanf("%d %d %d" ,&edge[i].a ,&edge[i].b ,&edge[i].c);
sort(edge + 1 ,edge + m + 1 ,camp);
for(i = 1 ;i <= m ;i ++)
{
for(j = 1 ;j <= n ;j ++)
mer[j] = j;
int sss = 0;
for(j = i ;j <= m ;j ++)
{
int xx = finds(edge[j].a);
int yy = finds(edge[j].b);
if(xx != yy) sss++ ,mer[xx] = yy;
if(sss == n - 1)
{
if(Ans == -1 || Ans > edge[j].c - edge[i].c)
Ans = edge[j].c - edge[i].c;
break;
}
}
}
printf("%d\n" ,Ans);
}
return 0;
}
最新文章
- 浅谈Excel开发:十一 针对64位Excel的插件的开发和部署
- 普通工程转为mvn工程
- 20145320《Java程序设计》第4周学习总结
- Java知多少(109)数据库更新
- DP:Skiing(POJ 1088)
- java的定时器用法
- information_schema.optimizer_trace学习
- Windows 7/Vista 开机自动登录
- ubuntu重启、关机命令
- input标签 disabled 和 readonly的区别
- ckplayer跨域调用
- MD5加密算法的Java版本
- android底部菜单栏的编写
- 743. Network Delay Time
- Deep TEN: Texture Encoding Network
- Linux实战教学笔记15:用户管理初级(下)
- LInux操作随手笔记
- 【leetcode 76. 最小覆盖子串】解题报告
- OpenCV学习笔记(一) 环境配置
- 【ACM】nyoj_7_街区最短路径问题_201308051737
热门文章
- Java练习——抽象类
- Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
- Java 面向对象 05
- CVE-2017-7529-Nginx越界读取缓存漏洞
- 对于如何从SM2的pfx证书文件中解析公钥和私钥,并从二次加密的密文中解密
- 从零学脚手架(五)---react、browserslist
- 你想知道的 std::vector::push_back 和 std::vector::emplace_back
- MySql历史与架构
- 3.DataFrame的增删改查
- 攻防世界 reverse Replace