【题意】

给出一个\(n(n<=100)\)个节点的的图,求最大边减最小边尽量小的生成树。

【算法】

\(Kruskal\)

【分析】

首先把边按边权从小到大进行排序。对于一个连续的边集区间\([L,R]\),如果这些边使得\(n\)个点全部联通,则一定存在一个苗条度不超过\(W[R]-W[L]\)的生成树(其中\(W[i]\)表示排序后第\(i\)条边的权值)。

从小到大枚举\(L\),对于每个\(L\),从小到大枚举\(R\),同时用并查集将新进入\([L,R]\)的边两端的点合并成一个集合,与\(Kruskal\)算法一样。当所有的点都联通是停止枚举\(R\),换下一个\(L\)(并且把\(R\)重置为\(L\)),继续枚举。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN=100+10;
const int MAXM=10000+10;
int n,m;
int fa[MAXN];
int maxn,ans=0x3f3f3f3f;
struct Node
{
int u,v,w;
}edge[MAXM];
inline int read()
{
int tot=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
tot=tot*10+c-'0';
c=getchar();
}
return tot;
}
inline bool cmp(Node x,Node y)
{
return x.w<y.w;
}
inline int find(int k)//并查集
{
if(fa[k]==k)return k;
else return fa[k]=find(fa[k]);
}
inline bool kruskal(int k)//判断是否能形成生成树
{
maxn=0;
int tot=0;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=k;i<=m;i++)
{
if(fa[find(edge[i].u)]!=fa[find(edge[i].v)])
{
maxn=edge[i].w;
fa[find(edge[i].u)]=fa[find(edge[i].v)];
tot++;
}
if(tot==n-1)return 1;//如果所有点都联通,则返回true
}
return 0;//否则返回false
}
int main()
{
while(1)
{
ans=0x3f3f3f3f;
n=read();m=read();
if(!n&&!m)break;
for(int i=1;i<=m;i++)
{
edge[i].u=read();
edge[i].v=read();
edge[i].w=read();
}
sort(edge+1,edge+1+m,cmp);//给边进行从小到大排序
for(int i=1;i<=m;i++)//枚举L
{
if(kruskal(i))
{
ans=min(ans,maxn-edge[i].w);//更新最小值
}
}
if(ans!=0x3f3f3f3f)cout<<ans<<endl;
else cout<<-1<<endl;//特判
}
return 0;
}

刘汝佳大法好!

最新文章

  1. [POJ2892]Tunnel Warfare
  2. 刚安装完jdk和eclipse需要配置什么?
  3. 一步一步写算法(之hash表)
  4. Best Time to Buy and Sell Stock (java)
  5. 微信小程序开发小记
  6. UOJ#36. 【清华集训2014】玛里苟斯 线性基
  7. iOS UIView 选择性倒角
  8. yum upgrade和yum update的区别
  9. vue 开发系列(七) 路由配置
  10. Jenkins-Pipeline 流水线发布
  11. ios开发之 -- NSData 和 NSString , UIImage 等之间的互转
  12. Ubuntu18---VMware虚拟机中Ubuntu18.04系统,开机输入密码后无响应黑屏
  13. Sequelize-nodejs-7-Associations
  14. linux 同步 rsync的使用——远程服务器同步配置
  15. 安全 流程服务器开新机器 内外网 iptables 安全组 用户安全root用户的使用.
  16. table数据跑马灯效果
  17. 《javascript模式--by Stoyan Stefanov》书摘--基本技巧
  18. python基础-第十三篇-13.2Web框架之Tornado
  19. Kotlin 函数和函数表达式
  20. Spring初学之FactoryBean配置Bean

热门文章

  1. Map集合类
  2. jquery实现图片切换
  3. 数据结构实验之图论四:迷宫探索【dfs 求路径】
  4. Bacteria (Gym - 101911C)
  5. 【原创】go语言学习(九)指针类型
  6. Cannot initialize a variable of type &#39;Stu *&#39; with an rvalue of type &#39;void *&#39;
  7. Jedis API操作redis数据库
  8. Tkinter 之Frame标签
  9. Tkinter 之Canvas画布
  10. python3编程基础之一:代码封装