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(最小生成树找瓶颈边)相关推荐

  1. 并查集+二分-hdu-4750-Count The Pairs

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...

  2. 最小生成树(kruskal、prim、最小生成森林问题、严格次小生成树)

    整理的算法模板合集: ACM模板 目录 一.kruskal算法 二.prim算法 三.Boruvka算法 四.生成森林问题(K颗树) 五.最小生成树的唯一性 六.严格次小生成树 LCA优化的次小生成树 ...

  3. 图的最小生成树(Prim算法)

    最小生成树 定义:生成树中边的权值(代价)之和最小的树 Prim Prim算法:普里姆算法,图论中的一种算法,可在加权连通图里搜索最小生成树. Ps:该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克( ...

  4. 压测瓶颈在mysql_MySQL的性能基线收集及压力测试

    建立基线的作用: 计算机科学中,基线是项目储存库中每个工件版本在特定时期的一个"快照". 比如我们现在有并发事物,那么在某时刻发起一个事物会产生当前数据的快照,那么这个快照就相当理 ...

  5. bzoj 1016: [JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5893  Solved: 2395 [Submit][ ...

  6. hdu-5723 Abandoned country(最小生成树+期望)

    题目链接: Abandoned country Time Limit: 8000/4000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java ...

  7. [CF/AT/Luogu]各大网站网赛 爆肝部部长工作报告文件Ⅱ

    文章目录 CodeForces LATOKEN-Round-1(Div.1+Div.2) A. Colour the Flag B. Histogram Ugliness C. Little Alaw ...

  8. 数据结构与算法(C语言)

    第一章: 数据结构绪论 1.什么是程序:程序 = 数据结构 + 算法 2.逻辑结构&物理结构的区别用法 基本的目标就是将数据及其逻辑关系存储到计算机的内存中 一:逻辑结构: 逻辑结构是指数据对 ...

  9. 赠书:《Java性能优化实践》,众多业内大佬推荐阅读

    没有捷径可走的 Java 性能优化 多年来,用 Google 搜索 Java performance tuning,出现的三篇最热门文章之一是于 1997 年到 1998 年左右发表的文章,这篇文章在 ...

最新文章

  1. 模板 - 二分图(包含全套常用定理性质)
  2. 【转】js frame 框架编程
  3. YOLO项目复活!大神接过衣钵,YOLO之父隐退2月后,v4版正式发布,性能大幅提升...
  4. python【蓝桥杯vip练习题库】ADV-235阶乘差
  5. Java写手机专题分析接口_jeesite学习文档API-内容管理模块
  6. 案例:Xshell 成功创建定时任务(解决no crontab for root using an empty one问题)- 最新版
  7. Spring Boot与JWT整合实现前后端分离的用户认证
  8. Thinkphp双轨直销系统源码
  9. u盘修复计算机系统,用u盘修复win7系统
  10. 2021年电工(初级)考试试卷及电工(初级)考试平台
  11. 【Windows】电脑清理个人隐私数据信息
  12. NB-IoT窄带物联网的优势特点
  13. 自定义修改elementUI组件样式(贯穿样式)
  14. SAP CO T-Code
  15. SaaSBase:免费的思维导图软件:2022年9种最好的工具
  16. 【论文笔记】Bullseye Polytope: A Scalable Clean-Label Poisoning Attack with Improved Transferability
  17. 你这么努力,为何还如此焦虑?
  18. 使用python计算内含报酬率
  19. 成为富人的十大心理特质,你有吗?
  20. 新库上线 | CnOpenData日本专利及引用被引用数据

热门文章

  1. Android_Layout (一)
  2. 不浮躁的社会是什么样的?
  3. HDU 4121 Xiangqi 模拟题
  4. 02-15 GUCCI 我喜欢的
  5. 计算机课堂教学改革培训心得体会,教学改革培训心得体会(精选3篇)
  6. 电脑知识:BIOS和UEFI的对比介绍!
  7. 程序员辞职的7个常用理由,你用的是哪一个?
  8. SQLServer数据库实例相关知识笔记
  9. java 开发注意项_JAVA开发注意事项集锦
  10. 实现linux cp 命令和修改配置文件