LD1-K(求差值最小的生成树)
/*
*题目大意:
*一个简单图,n个点,m条边;
*要求一颗生成树,使得其最大边与最小边的差值是所有生成树中最小的,输出最小的那个差值; *算法分析:
*枚举最小边,用kruskal求生成树,不断更新差值得到最优值;
**/ #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<climits>
#include<cstdlib>
using namespace std; const int N=111;
const int M=5555;
const int INF=0xffffff; int n,m;
int p[N]; struct Edge
{
int u,v,w;
} e[M]; int cmp(const void *a,const void *b)
{
Edge *x=(Edge *)a;
Edge *y=(Edge *)b;
return x->w-y->w;
} int find(int x)
{
if(p[x]!=x)
p[x]=find(p[x]);
return p[x];
} int Kruskal(int s)
{
int cnt=0;//记录边数
for(int i=1; i<=n; i++)
p[i]=i;
int t=s;
int flag=1;
while(t<m)
{
if(find(e[t].u)==find(e[t].v))
flag=0;
if(flag)
{
p[find(e[t].v)]=find(e[t].u);
cnt++;
if(cnt==n-1)
break;
}
t++;
flag=1;
}
if(cnt<n-1)
return -1;
return e[t].w-e[s].w;//最大边-最小边
} int main()
{
//freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
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 ans=INF;
for(int i=0; i<=m-n+1; i++)//枚举所有m-n+1颗生成树
{
int res=Kruskal(i);
if(res==-1)
break;
if(res<ans)
ans=res;
}
if(ans==INF)
puts("-1");
else
printf("%d\n",ans);
}
return 0;
}
LD1-K(求差值最小的生成树)的更多相关文章
- 【poj3522-苗条树】最大边与最小边差值最小的生成树,并查集
题意:求最大边与最小边差值最小的生成树.n<=100,m<=n*(n-1)/2,没有重边和自环. 题解: m^2的做法就不说了. 时间复杂度O(n*m)的做法: 按边排序,枚举当前最大的边 ...
- Poj 3522 最长边与最短边差值最小的生成树
题意: 让你求一颗生成树,使得最长边和最短边长度差值最小. 思路: 额!!!感觉这个思路会超时,但是ac了,暂时没什么别的好思路,那么就先说下这个思路,大牛要是有好的思路希望能在 ...
- P1223 [小数据版]边权差值最小的生成树
这道题和最小生成树kruskal的代码几乎相同,只不过不一定是最小生成树,所以不一定从最短的边开始做生成树:所以将每一条边分别作为起点,然后枚举就行了...... #include <bits/ ...
- 基于visual Studio2013解决面试题之1101差值最小
题目
- 将元素平分成差值最小的两个集合(DP)
现有若干物品,要分成较为平均的两部分,分的规则是这样的: 1)两部分物品的个数最多只能差一个. 2)每部分物品的权值总和必须要尽可能接近. 现在请你编写一个程序,给定现在有的物品的个数以及每个物品的权 ...
- 传说中的华为Python笔试题——两等长整数序列互换元素,序列和的差值最小(修正)
有两个序列a,b,大小都为n,序列元素的值任意整形数,无序:要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小. 1. 将两序列合并为一个序列,并排序,得到source ...
- find the most comfortable road(并差集,找差值最小的权值)
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 【方法】list<?> 两个list集合 查找不同元素,求差值
//方法1 //自己声明list//思路,从list1中删除list2中相同的元素//使用循环遍历对比的方式删除//list1包含list2,list1多与list2//结束得出list1为不相同元素 ...
- BZOJ2395 [Balkan 2011]Timeismoney 【最小乘积生成树】
题目链接 BZOJ2395 题意:无向图中每条边有两种权值,定义一个生成树的权值为两种权值各自的和的积 求权值最小的生成树 题解 如果我们将一个生成树的权值看做坐标,那么每一个生成树就对应一个二维平面 ...
随机推荐
- 初识AM335X
TI 的AM335X,linux 操作系统,全都是陌生的东东,一点一点来熟悉吧. 拿的TI代理的一开发板,直接看文档.环境由于之前一同事已经装好了,公司条件受限,没法让我们一人一台ubuntu的机子来 ...
- 互联网TCP/IP五层模型(一)
转载自:阮一峰 我们每天使用互联网.你是否想过,它是怎样实现的? 全世界几十亿台电脑,连接在一起,两两通信. 上海的某一块网卡送出信号,洛杉矶的还有一块网卡竟然就收到了.两者实际上根本不知道对方的物理 ...
- 在Quick-cocos2dx中使用云风pbc解析Protocol Buffers,支持win、mac、ios、android
本例主要介绍 如何将 pbc 集成到quick-cocos2dx框架中,让我们的cocos2dx客户端Lua拥有编解码Protocol Buffers能力. 参考: 云风pbc的用法: http:// ...
- Android 使用加速度传感器实现摇一摇功能及优化
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 目前很多应用已经实现了摇一摇功能,这里通过讲解该功能的原理及实现回顾一下加速度传感器的使用: 1.首先获得 ...
- redis 中文手册
https://redis.readthedocs.org/en/latest/ http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis ...
- 把C#对象转换为json字符串
下面的代码写在ashx一般处理程序中 声明context.Response.ContentType = "application/json";代表服务器端返回的数据为json字符串 ...
- WIN10FTP服务器搭建
在WIN10上搭建FTP服务器 先建立两个文件夹,区分上传和下载,做测试 用 然后在管理--服务界面新建一个用户 用户目录下创建一个用户 因为服务应用程序里面没有IIS,所以我们打开控制面板里面的程序 ...
- document.all用法
document.all用法 一. document.all是页面内所有元素的一个集合.例如: document.all(0)表示页面内第一个元素二.document.all可以判断浏览器 ...
- css标签选择器
/*标签选择器*/ input[type="text"] { width: 60%; } </style>
- VB 活动添加item元素
'ListView1.Columns.Clear() 'ListView1.Columns.Add("", 0, HorizontalAlignment.Center) 'List ...