博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1111 修复公路 并查集 图论 最小生成树
阅读量:6398 次
发布时间:2019-06-23

本文共 1380 字,大约阅读时间需要 4 分钟。

洛谷P1111 修复公路    

并查集   图论  最小生成树

题意 不断往图中加边,加边有时间,求这张图什么时候互相连通

开始的时候我太naive,想到的是 传递闭包 +bitset 压位优化
这样 nm 100000000 感觉可以,就是常数太大
然后发现 可以用最小生成树来做
最小生成树中所有点都互相连通,以时间为权值,最早的时间就是生成树
中最大的那条边

不过我不知道为什么一定要交换一下,那位大神知道帮我解释一下。。。

 

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 using namespace std ; 10 11 const int maxn = 1011,maxm = 100011 ; 12 struct node{13 int from,to,val ; 14 }e[2*maxm]; 15 int n,m,dx,dy,x,y,v ; 16 int fa[maxn],size[maxn] ; 17 18 inline int find(int x)19 {20 if(fa[x]==x) return x ; 21 fa[x] = find(fa[x]) ; 22 return fa[x] ; 23 }24 25 bool cmp(node a,node b) 26 {27 return a.val < b.val ; 28 }29 30 int main() 31 {32 scanf("%d%d",&n,&m) ; 33 for(int i=1;i<=m;i++) 34 {35 scanf("%d%d%d",&x,&y,&v) ; 36 e[ i ].from = x ; 37 e[ i ].to = y ; 38 e[ i ].val = v ;39 }40 for(int i=1;i<=n;i++) fa[ i ] = i,size[ i ] = 1 ; 41 sort(e+1,e+m+1,cmp) ; 42 for(int i=1;i<=m;i++) 43 {44 dx = find(e[ i ].from) ; 45 dy = find(e[ i ].to) ; 46 if(dx==dy) continue ; // 这里貌似一定得交换 47 if(dx > dy) swap(dx,dy) ; 48 fa[dy] = dx ; 49 size[dx] = size[dx]+size[dy] ; 50 if(size[dx]==n) 51 {52 printf("%d\n",e[ i ].val) ; 53 return 0 ; 54 }55 }56 printf("-1\n") ; 57 return 0 ; 58 }

 

转载于:https://www.cnblogs.com/third2333/p/6999406.html

你可能感兴趣的文章
springboot统一表单数据校验
查看>>
使用bat将优盘中的dig加到系统环境变量
查看>>
Rust 语言学习笔记(四)—— I/O
查看>>
Java实现流控-Semaphore
查看>>
题解 CF948A 【Protect Sheep】
查看>>
打破软件自动化测试的格局
查看>>
Google 开源新型强化学习框架 Dopamine
查看>>
TreeSet集合的add()方法的源码解析
查看>>
从闭包函数的变量自增的角度 - 解析js垃圾回收机制
查看>>
React+GraphQL入门
查看>>
导入MySQL官方样本数据库employees的问题
查看>>
基于 HTML5 的 3D 工业互联网展示方案
查看>>
.NET MD5加密解密代码
查看>>
JavaScript 中有用的 Array 和 Object 方法
查看>>
Java文件上传细讲
查看>>
公司表态+马斯克暗示,特斯拉在全球将会有5座“超级电池”工厂
查看>>
Java Web的传值汇总(含JavaBean)
查看>>
万达调整架构第四次转型:成立网络科技集团
查看>>
代理IP收集
查看>>
【IT背包客】CIO们的徽杭古道徒步记
查看>>