/*
题意:就是给你一个图,图的每两个点都有多条路径,每一条路径中都有一条最大边,
所有最大边的最小边(也就是瓶颈边)就是这两点之间的val值!然后给你一个值f,
问有多少个顶点对的val>=f! (u,v) 和 (v, u)是不同的顶点对! 思路:最小生成树(kruskral)那么每两个节点(u,v)的瓶颈边就是这一棵树中u到v
的路径中的最大边值!
在利用并查集的过程中,A, B两个集合,如果有u属于A,v属于B,且u-v可以将
A-B集合连接起来,因为边值由小到大选取,那么以u-v边为瓶颈边的节点的个数
就是[A]*[B]*2; 注意:图不一定是连通的,开始的时候当成了一棵树,怎么改都不对!
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 10105
#define M 500105
using namespace std;
int f[N];
struct Edge{
int u, v, w;
Edge(){}
Edge(int u, int v, int w){
this->u=u;
this->v=v;
this->w=w;
}
}; Edge edge[M];
int dist[N];
int rank[N];
int cnt[N];
int edgeN;
int sumN[N];
int n, m; bool cmp(Edge a, Edge b){
return a.w < b.w;
} int getFather(int x){
return x==f[x] ? x : f[x]=getFather(f[x]);
} bool Union(int a, int b){
a=getFather(a);
b=getFather(b);
if(a!=b){
cnt[++edgeN]=sumN[a]*sumN[b]*;//记录以这一条边为瓶颈边的节点对的个数
if(rank[a]>rank[b]){
f[b]=a;
sumN[a]+=sumN[b];//将b集合放入到a集合中去
}
else{
f[a]=b;
sumN[b]+=sumN[a];//将a集合放入到b集合中去
++rank[b];
}
return true;
}
return false;
} void Kruskral(){
edgeN=;
sort(edge, edge+m, cmp);
for(int i=; i<=n; ++i)
f[i]=i, rank[i]=, sumN[i]=;
for(int i=; i<m; ++i)
if(Union(edge[i].u, edge[i].v))
dist[edgeN]=edge[i].w;//记录最小生成树中的边值
cnt[edgeN+]=;
for(int i=edgeN; i>=; --i)//统计大于等于第i条边为瓶颈边边值的所有节点对的对数
cnt[i]+=cnt[i+];
} int main(){
int p;
while(scanf("%d%d", &n, &m)!=EOF){
for(int i=; i<m; ++i){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
edge[i]=Edge(u+, v+, w);
}
Kruskral();
scanf("%d", &p);
while(p--){
int x;
scanf("%d", &x);
int index=lower_bound(dist+, dist+edgeN+, x)-dist;
if(index>edgeN) printf("0\n");
else printf("%d\n", cnt[index]);
}
}
return ;
}
//如果最后只有一棵树的话,这样做就可以了!没想到可能不是仅仅一棵树
1 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 10105
#define M 500105
using namespace std;
int f[N];
struct Edge{
int u, v, w;
Edge(){}
Edge(int u, int v, int w){
this->u=u;
this->v=v;
this->w=w;
}
}; Edge edge[M];
int dist[N];
int rank[N];
int cnt[N];
int edgeN; int n, m; bool cmp(Edge a, Edge b){
return a.w < b.w;
} int getFather(int x){
return x==f[x] ? x : f[x]=getFather(f[x]);
} bool Union(int a, int b){
a=getFather(a);
b=getFather(b);
if(a!=b){
if(rank[a]>rank[b])
f[b]=a;
else{
f[a]=b;
++rank[b];
}
return true;
}
return false;
} void Kruskral(){
edgeN=;
sort(edge, edge+m, cmp);
for(int i=; i<=n; ++i)
f[i]=i, rank[i]=;
for(int i=; i<m; ++i)
if(Union(edge[i].u, edge[i].v))
dist[++edgeN]=edge[i].w;
cnt[edgeN+]=;
for(int i=edgeN; i>=; --i){
cnt[i]=i*;
cnt[i]+=cnt[i+];
}
} int main(){
int p;
while(scanf("%d%d", &n, &m)!=EOF){
for(int i=; i<m; ++i){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
edge[i]=Edge(u+, v+, w);
}
Kruskral();
scanf("%d", &p);
while(p--){
int x;
scanf("%d", &x);
int index=lower_bound(dist+, dist+edgeN+, x)-dist;
if(index>edgeN) printf("0\n");
else printf("%d\n", cnt[index]);
}
}
return ;
}

hdu4750Count The Pairs(最小生成树找瓶颈边)的更多相关文章

  1. HDU-4750 Count The Pairs 最小生成树,并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4750 题意:Q个询问t,求在一个无向图上有多少对点(i,j)满足 i 到 j 的所有路径上的最长边的最 ...

  2. UVA - 11354 Bond(最小生成树+LCA+瓶颈路)

    题意:N个点,M条路,每条路的危险度为路上各段中最大的危险度.多组询问,点s到点t的所有路径中最小的危险度. 分析: 1.首先建个最小生成树,则s到t的路径一定是危险度最小的. 原因:建最小生成树的最 ...

  3. Codeforces 632F - Magic Matrix(暴力 bitset or Prim 求最小生成树+最小瓶颈路)

    题面传送门 开始挖老祖宗(ycx)留下来的东西.jpg 本来想水一道紫题作为 AC 的第 500 道紫题的,结果发现点开了道神题. 首先先讲一个我想出来的暴力做法.条件一和条件二直接扫一遍判断掉.先将 ...

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

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

  5. 图解最小生成树 - 克鲁斯卡尔(Kruskal)算法

    我们在前面讲过的<克里姆算法>是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的.同样的思路,我们也可以直接就以边为目标去构建,因为权值为边上,直接找最小权值的边来构建生成树 ...

  6. HDU 4081 Qin Shi Huang&#39;s National Road System 最小生成树

    点击打开链接题目链接 Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  7. bzoj列表2

    之前发过一次了,这里的题较水,没什么好讲的 bzoj1088 直接穷举前两位即可,话说程序员的扫雷是白玩的? bzoj1083 裸的最小生成树(最小生成树=最小瓶颈树),SCOI大丈夫(话说网上二分是 ...

  8. 正睿OI国庆DAY2:图论专题

    正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力 ...

  9. OI知识点/得分技巧的归纳总结

    网络流 拆点/拆边技巧 题目来源 bzoj1070 题目描述 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...

随机推荐

  1. Android中,图片分辨率适配总结规则drawable drawable-mdpi drawable-hdpi drawable-nodpi drawable-ldpi

    一直关于android多分辨率适配有些疑惑,从网上找到一些资料并通过测试验证,参考链接:http://blog.csdn.net/lamp_zy/article/details/7686477 现记录 ...

  2. webuploader 断点续传

    webuploader 实现 断点续传webuploader是百度开发的上传文件前端控件.可支持html5和flash,因此对浏览器的兼容比较好.因为需要用到ie8,ie8不支持html5,所以必须支 ...

  3. DNS的view设置

    在实际的网络应用中,我们有时希望对于同一个Domain Name能够根据不同的请求IP 地址/区域,解析到不同的对应IP地址,比如:有时对于企业内部网络和外部网络希望对同一域名解析到不同的IP地址以达 ...

  4. QQ在线客服设置

    QQ在线客服设置 1.客户在添加QQ在线客服后,需要让用户在线不需要添加为好友就能在线对话,一般默认设置下会显示"您需要添加对方为好友+才能给对方发送会话消息",具体解决方法如下: ...

  5. ASP.NET 5系列教程 (一):领读新特性

    近期微软发布了ASP.NET 5.0,本次发布的新特性需求源于大量用户的反馈和需求,例如灵活的跨平台运行时和自主部署能力使ASP.NET应用不再受限于IIS.Cloud-ready环境配置降低了云端部 ...

  6. 深入理解CSS弹性盒模型flex

    × 目录 [1]版本更迭 [2]display [3]基本概念[4]伸缩容器[5]伸缩项目 前面的话 CSS3引入了一种新的布局模型——flex布局.flex是flexible box的缩写,一般称之 ...

  7. PostgreSQL基础整理(二)

    存储过程 实现功能:针对工资表30岁以下,工资提升10% 30至40提升20% 40以上提升30% + 奖金(入参)返回平均薪酬 创建表: DROP TABLE emps; CREATE TABLE ...

  8. InnoSetup 如何获取安装程序的路径?

    两个常量可以使用: {srcexe} 安装程序执行文件的路径.      {src} 安装程序所在路径. path := ExpandConstant('{srcexe}');

  9. 团队项目——站立会议DAY13

    第十三次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:在完成各项功能的基础上继续进行扩展完善 2.钟灵毓秀:进行模块分类的整合与纠错修改,整理错误向队友提出 ...

  10. 第二次作业:Github的使用

    Github的使用 一·注册:     要想使用github第一步当然是注册github账号了.之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称 ...