hdu4750Count The Pairs(最小生成树找瓶颈边)
1 /* 2 题意:就是给你一个图,图的每两个点都有多条路径,每一条路径中都有一条最大边, 3 所有最大边的最小边(也就是瓶颈边)就是这两点之间的val值!然后给你一个值f, 4 问有多少个顶点对的val>=f! (u,v) 和 (v, u)是不同的顶点对! 5 6 思路:最小生成树(kruskral)那么每两个节点(u,v)的瓶颈边就是这一棵树中u到v 7 的路径中的最大边值! 8 在利用并查集的过程中,A, B两个集合,如果有u属于A,v属于B,且u-v可以将 9 A-B集合连接起来,因为边值由小到大选取,那么以u-v边为瓶颈边的节点的个数 10 就是[A]*[B]*2; 11 12 注意:图不一定是连通的,开始的时候当成了一棵树,怎么改都不对! 13 */ 14 #include<iostream> 15 #include<cstring> 16 #include<cstdio> 17 #include<algorithm> 18 #define N 10105 19 #define M 500105 20 using namespace std; 21 int f[N]; 22 struct Edge{ 23 int u, v, w; 24 Edge(){} 25 Edge(int u, int v, int w){ 26 this->u=u; 27 this->v=v; 28 this->w=w; 29 } 30 }; 31 32 Edge edge[M]; 33 int dist[N]; 34 int rank[N]; 35 int cnt[N]; 36 int edgeN; 37 int sumN[N]; 38 int n, m; 39 40 bool cmp(Edge a, Edge b){ 41 return a.w < b.w; 42 } 43 44 int getFather(int x){ 45 return x==f[x] ? x : f[x]=getFather(f[x]); 46 } 47 48 bool Union(int a, int b){ 49 a=getFather(a); 50 b=getFather(b); 51 if(a!=b){ 52 cnt[++edgeN]=sumN[a]*sumN[b]*2;//记录以这一条边为瓶颈边的节点对的个数 53 if(rank[a]>rank[b]){ 54 f[b]=a; 55 sumN[a]+=sumN[b];//将b集合放入到a集合中去 56 } 57 else{ 58 f[a]=b; 59 sumN[b]+=sumN[a];//将a集合放入到b集合中去 60 ++rank[b]; 61 } 62 return true; 63 } 64 return false; 65 } 66 67 void Kruskral(){ 68 edgeN=0; 69 sort(edge, edge+m, cmp); 70 for(int i=1; i<=n; ++i) 71 f[i]=i, rank[i]=0, sumN[i]=1; 72 for(int i=0; i<m; ++i) 73 if(Union(edge[i].u, edge[i].v)) 74 dist[edgeN]=edge[i].w;//记录最小生成树中的边值 75 cnt[edgeN+1]=0; 76 for(int i=edgeN; i>=1; --i)//统计大于等于第i条边为瓶颈边边值的所有节点对的对数 77 cnt[i]+=cnt[i+1]; 78 } 79 80 int main(){ 81 int p; 82 while(scanf("%d%d", &n, &m)!=EOF){ 83 for(int i=0; i<m; ++i){ 84 int u, v, w; 85 scanf("%d%d%d", &u, &v, &w); 86 edge[i]=Edge(u+1, v+1, w); 87 } 88 Kruskral(); 89 scanf("%d", &p); 90 while(p--){ 91 int x; 92 scanf("%d", &x); 93 int index=lower_bound(dist+1, dist+edgeN+1, x)-dist; 94 if(index>edgeN) printf("0\n"); 95 else printf("%d\n", cnt[index]); 96 } 97 } 98 return 0; 99 }
//如果最后只有一棵树的话,这样做就可以了!没想到可能不是仅仅一棵树 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define N 10105 6 #define M 500105 7 using namespace std; 8 int f[N]; 9 struct Edge{ 10 int u, v, w; 11 Edge(){} 12 Edge(int u, int v, int w){ 13 this->u=u; 14 this->v=v; 15 this->w=w; 16 } 17 }; 18 19 Edge edge[M]; 20 int dist[N]; 21 int rank[N]; 22 int cnt[N]; 23 int edgeN; 24 25 int n, m; 26 27 bool cmp(Edge a, Edge b){ 28 return a.w < b.w; 29 } 30 31 int getFather(int x){ 32 return x==f[x] ? x : f[x]=getFather(f[x]); 33 } 34 35 bool Union(int a, int b){ 36 a=getFather(a); 37 b=getFather(b); 38 if(a!=b){ 39 if(rank[a]>rank[b]) 40 f[b]=a; 41 else{ 42 f[a]=b; 43 ++rank[b]; 44 } 45 return true; 46 } 47 return false; 48 } 49 50 void Kruskral(){ 51 edgeN=0; 52 sort(edge, edge+m, cmp); 53 for(int i=1; i<=n; ++i) 54 f[i]=i, rank[i]=0; 55 for(int i=0; i<m; ++i) 56 if(Union(edge[i].u, edge[i].v)) 57 dist[++edgeN]=edge[i].w; 58 cnt[edgeN+1]=0; 59 for(int i=edgeN; i>=1; --i){ 60 cnt[i]=i*2; 61 cnt[i]+=cnt[i+1]; 62 } 63 } 64 65 int main(){ 66 int p; 67 while(scanf("%d%d", &n, &m)!=EOF){ 68 for(int i=0; i<m; ++i){ 69 int u, v, w; 70 scanf("%d%d%d", &u, &v, &w); 71 edge[i]=Edge(u+1, v+1, w); 72 } 73 Kruskral(); 74 scanf("%d", &p); 75 while(p--){ 76 int x; 77 scanf("%d", &x); 78 int index=lower_bound(dist+1, dist+edgeN+1, x)-dist; 79 if(index>edgeN) printf("0\n"); 80 else printf("%d\n", cnt[index]); 81 } 82 } 83 return 0; 84 }
hdu4750Count The Pairs(最小生成树找瓶颈边)相关推荐
- 并查集+二分-hdu-4750-Count The Pairs
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...
- 最小生成树(kruskal、prim、最小生成森林问题、严格次小生成树)
整理的算法模板合集: ACM模板 目录 一.kruskal算法 二.prim算法 三.Boruvka算法 四.生成森林问题(K颗树) 五.最小生成树的唯一性 六.严格次小生成树 LCA优化的次小生成树 ...
- 图的最小生成树(Prim算法)
最小生成树 定义:生成树中边的权值(代价)之和最小的树 Prim Prim算法:普里姆算法,图论中的一种算法,可在加权连通图里搜索最小生成树. Ps:该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克( ...
- 压测瓶颈在mysql_MySQL的性能基线收集及压力测试
建立基线的作用: 计算机科学中,基线是项目储存库中每个工件版本在特定时期的一个"快照". 比如我们现在有并发事物,那么在某时刻发起一个事物会产生当前数据的快照,那么这个快照就相当理 ...
- bzoj 1016: [JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5893 Solved: 2395 [Submit][ ...
- hdu-5723 Abandoned country(最小生成树+期望)
题目链接: Abandoned country Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
- [CF/AT/Luogu]各大网站网赛 爆肝部部长工作报告文件Ⅱ
文章目录 CodeForces LATOKEN-Round-1(Div.1+Div.2) A. Colour the Flag B. Histogram Ugliness C. Little Alaw ...
- 数据结构与算法(C语言)
第一章: 数据结构绪论 1.什么是程序:程序 = 数据结构 + 算法 2.逻辑结构&物理结构的区别用法 基本的目标就是将数据及其逻辑关系存储到计算机的内存中 一:逻辑结构: 逻辑结构是指数据对 ...
- 赠书:《Java性能优化实践》,众多业内大佬推荐阅读
没有捷径可走的 Java 性能优化 多年来,用 Google 搜索 Java performance tuning,出现的三篇最热门文章之一是于 1997 年到 1998 年左右发表的文章,这篇文章在 ...
最新文章
- 模板 - 二分图(包含全套常用定理性质)
- 【转】js frame 框架编程
- YOLO项目复活!大神接过衣钵,YOLO之父隐退2月后,v4版正式发布,性能大幅提升...
- python【蓝桥杯vip练习题库】ADV-235阶乘差
- Java写手机专题分析接口_jeesite学习文档API-内容管理模块
- 案例:Xshell 成功创建定时任务(解决no crontab for root using an empty one问题)- 最新版
- Spring Boot与JWT整合实现前后端分离的用户认证
- Thinkphp双轨直销系统源码
- u盘修复计算机系统,用u盘修复win7系统
- 2021年电工(初级)考试试卷及电工(初级)考试平台
- 【Windows】电脑清理个人隐私数据信息
- NB-IoT窄带物联网的优势特点
- 自定义修改elementUI组件样式(贯穿样式)
- SAP CO T-Code
- SaaSBase:免费的思维导图软件:2022年9种最好的工具
- 【论文笔记】Bullseye Polytope: A Scalable Clean-Label Poisoning Attack with Improved Transferability
- 你这么努力,为何还如此焦虑?
- 使用python计算内含报酬率
- 成为富人的十大心理特质,你有吗?
- 新库上线 | CnOpenData日本专利及引用被引用数据