JDOJ 1044 Span
2024-10-19 17:55:06
JDOJ 1044 Span
https://neooj.com/oldoj/problem.php?id=1044
Description
某国有N个村子,M条道路,为了实现“村村通工程”现在要”油漆”N-1条道路(因为某些人总是说该国所有的项目全是从国外进口来的,只是漆上本国的油漆罢了),因为“和谐”是此国最大的目标和追求,以致于对于最小造价什么的都不在乎了,只希望你所选出来的最长边与最短边的差越小越好。
Input
第一行给出一个数字TOT,代表有多少组数据,Tot<=6 对于每组数据,首先给出N,M 下面M行,每行三个数a,b,c代表a村与b的村道路距离为c.
Output
输出最小差值,如果无解输出”-1”.
Sample Input
1 4 5 1 2 3 1 3 5 1 4 6 2 4 6 3 4 7
Sample Output
1
HINT
【样例解释】 选择1-4,2-4,3-4这三条边. 【数据范围】 1:2 ≤ n ≤ 100 and 0 ≤ m ≤ n(n − 1)/2 2:每条边的权值小于等于10000 3:保证没有自环,没有重边
不要把这道题想象成最小生成树的练习题,虽然原理跟最小生成树很像,但是题目中明确要求不要求最小造价,所以我们的解决办法是,使用kruskal算法排序后,从小到大枚举每条边,每次都跑最小生成树,然后更新ans为最长边与最短边差的最小值。
Code:
#include<cstdio>
#include<algorithm>
using namespace std;
int fa[];
int cnt,n,m,tot;
int ans=;
struct rec
{
int x,y,z;
}e[];
bool cmp(rec a,rec b)
{
return a.z>b.z;
}
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int main()
{
scanf("%d",&tot);
while(tot--)
{
ans=;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
sort(e+,e+m+,cmp);
for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)
fa[j]=j;
cnt=;
for(int j=i;j<=m;j++)
{
int fx=find(e[j].x);
int fy=find(e[j].y);
if(fx!=fy)
{
fa[fx]=fy;
cnt++;
if(cnt==n-)
{
ans=min(ans,e[i].z-e[j].z);
break;
}
}
}
}
if(ans<)
printf("%d\n",ans);
else
printf("-1\n");
}
return ;
}
最新文章
- Android开发面试经——6.常见面试官提问Android题②(更新中...)
- WebDriverExtensionsByC#
- 8款超酷的HTML5 3D图片动画源码
- [原创]个人工具 - YE快速复制助手(YeFastcopyHelper)
- mongodb权威指南读书笔记
- C++中的对象数组
- 页面加载时,页面中DIV随之滑动出来;去掉页面滚动条
- java核心技术学习笔记之三程序设计结构
- vue学习笔记 概述(一)
- ADB——修改手机默认参数
- 图解HTTPS协议
- AI,大数据,复杂系统 最精 40本大书单
- swift - 本地通知2 - 啰嗦版
- css 图片文字居中
- Mongodb网络好文章
- IIS7.5 中启用rest服务,Delete、Put
- vb 读取指定路径文件名
- win10 U盘安装ubuntu16.04双系统
- 多线程中的synchronized小结
- word中怎么快速选中光标之前或之后的全部内容?