UVA - 1395 Slim Span (最小生成树Kruskal)
2024-08-30 11:15:30
Kruskal+并查集。
点很少,按边权值排序,枚举枚举L和R,并查集检查连通性。一旦连通,那么更新答案。
判断连通可以O(1),之前O(n)判的,第一次写的过了,后来T。。
#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
const int maxe = maxn*maxn>>;
int n,m; int u[maxe],v[maxe],w[maxe]; int pa[maxn]; inline bool cmp(int a,int b) { return w[a]<w[b]; }
int r[maxe]; inline void idxSort()
{
for(int i = ; i < m; i++) r[i] = i;
sort(r,r+m,cmp);
} int Find(int x) { return x==pa[x]?x:pa[x]=Find(pa[x]); }
int cnt,ans; inline void Union(int a,int b)
{
int s1 = Find(a),s2 = Find(b);
if(s1 != s2){
pa[s1] = s2,cnt--;
}
} inline void initUFS() { for(int i = ; i <= n; i++) pa[i] = i; cnt = n-; } const int INF = 0x3f3f3f3f; int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m),n){
for(int i = ; i < m; i++)
scanf("%d%d%d",u+i,v+i,w+i); idxSort();
ans = INF;
for(int i = ; i < m; i++){
initUFS();
for(int j = i; j < m; j++){
int R = r[j];
Union(u[R],v[R]);
if(!cnt) {
ans = min(ans,w[R]-w[r[i]]); break;
}
}
}
printf("%d\n",ans==INF?-:ans);
}
return ;
}
最新文章
- JavaScript自定义媒体播放器
- [转]ORACLE 审计功能
- Ms - Sql 定位附近的人
- 用Qt开发第一个Hello World程序
- 大数据技术hadoop入门理论系列之二&mdash;HDFS架构简介
- 如何通过VIM把代码格式化后生成HTML网页代码
- Mac OS X 10.10 Yosemite PHP 5.5.14 free type support fix
- URAL 1009 K-based Numbers
- JavaIO流程--创建文件和目录的实例
- H5游戏见缝插针开发
- Eclipse导入项目常见问题----服务器版本问题02
- java-生产者消费者模式
- 自学python Day01
- 嵌入式Linux基于framebuffer的jpeg格式本地LCD屏显示
- Redis for linux安装配置之—-源码安装
- 关于JS获取某月最后一天
- Jmeter(二十六)Jmeter-Question之“集成Jenkins”
- 001-windows下Elasticsearch安装、Elasticsearch-header安装
- springboot之登录注册
- 【c++】c++中重载输出操作符,为什么要返回引用