题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4750

题目大意:

给一无向图,n个点,m条边,每条边有个长度,且不一样。定义f(i,j)表示从节点i到节点j的所有路径中的最大边权值的最小值。有q个询问,每个询问有个t,求f(i,j)>=t的种数。

解题思路:

并查集+简单dp+二分。

比赛的时候各种TLE和MLE。只是查找方式不对。

队友思路,先按边从小到大排序考虑,对于每条边E该边两个节点为a、b,如果a、b不在同一个联通块,则a联通块中点集A和b联通块中点集B的f值一定为E(因为E升序)。恰好能使其通路。

map[i]表示以权值为i的边作为f值的点对个数。

sum[i]表示以大于等于第i大边权值的权值作为f值得点对总的个数。

对于每一个t,在排序了的sig[i](能取的边权值)中二分找到大于等于它的最小的小标j。输出sum[j]即可。

注意:

求点对个数时要乘以2.

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#define eps 1e-6
#define INF 0x3fffffff
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;#define Maxn 11000
#define Maxm 510000
struct Edge
{int a,b,c;
}edge[Maxm];
map<int,int>myp;short int fa[Maxn],num[Maxn];
int n,m;
int sum[Maxm],sig[Maxm];bool cmp(struct Edge aa,struct Edge bb)
{return aa.c<bb.c; //对边排序
}int find(int x) //并查集 路径压缩
{int tmp=x;while(x!=fa[x])x=fa[x];while(fa[tmp]!=x){int tt=fa[tmp];fa[tmp]=x;tmp=tt;}return x;
}int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);while(~scanf("%d%d",&n,&m)){int a,b,c;myp.clear();for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);edge[i].a=a,edge[i].b=b,edge[i].c=c;sig[i]=c;}sort(edge+1,edge+m+1,cmp);for(int i=0;i<=n;i++){fa[i]=i;num[i]=1; //以i为根的联通块点的个数}for(int i=1;i<=m;i++){int ra=find(edge[i].a);int rb=find(edge[i].b);if(ra!=rb) //不在一个联通块内,两个块内的点通过该边连接,f值为该边{if(myp.find(edge[i].c)!=myp.end())myp[edge[i].c]=myp[edge[i].c]+num[ra]*num[rb]*2;elsemyp[edge[i].c]=num[ra]*num[rb]*2;fa[rb]=ra; //合并num[ra]+=num[rb];}}int q;scanf("%d",&q);sort(sig+1,sig+m+1); //对边权值排序memset(sum,0,sizeof(sum));//sum[i]表示以大于等于第i大边权值的权值作为f值得点对总的个数。sum[m]=myp[sig[m]];for(int i=m-1;i>=1;i--)sum[i]+=sum[i+1]+myp[sig[i]];for(int i=1;i<=q;i++){int tt;scanf("%d",&tt);int pos=lower_bound(sig+1,sig+m+1,tt)-sig;//二分查找位置printf("%d\n",sum[pos]);}}return 0;
}

转载于:https://www.cnblogs.com/suncoolcat/p/3333830.html

并查集+二分-hdu-4750-Count The Pairs相关推荐

  1. HDU 3081 Marriage Match II (并查集+二分+最大流 | 并查集+二分图匹配)

    题意:n 个男生.n个女生玩游戏,每个女生都可以和她不讨厌的男生结婚,此外她的朋友如果也不讨厌这个男生,也可以和他结婚:对于女生,如果A和B是朋友,B和C是朋友,那么A和C也是朋友.每次游戏女生会找一 ...

  2. 【2018.5.19】模拟赛之四-ssl2435 航空公司【并查集,二分】

    正题 题目大意 有n个点,给出坐标,选择所有距离在k之内的边要求联通所有点,求最小的k. 解题思路 垃圾解法 用二分答案然后加并查集求是否联通. 时间复杂度:O(mlogn)O(mlogn)O(mlo ...

  3. 【BZOJ2594】水管局长加强版,LCT+并查集+二分查找位置

    Time:2016.05.10 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: LCT维护路径最小值 倒叙处理询问,就相当于往图里面加边. 实时维护最小值,即最小生成树,可以参照魔法 ...

  4. P1396 营救(并查集+二分)

    思路:检验函数中,先初始化每个节点的下标,每调用检验函数就从新使用一次并查集(并查集的时间复杂度非常低),然后,就看当一条路的价值val<=假设最大值x时,就把他们连接起来. #include& ...

  5. POJ-2985(树状数组 + 并查集 + 二分)

    题目:http://poj.org/problem?id=2985 这题考察了两个点呢,组合并用到了并查集,求第K大的数用到了树状数组,刚开始WA了几次,发现是在组合并之后仅仅update(*, -1 ...

  6. HDU 3277 Marriage Match III(并查集+二分+最大流)

    题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮 思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢 ...

  7. 克鲁斯卡尔(并查集)hdu 1233

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. 【并查集】 HDU 4424 Conquer a New Region 贪心

    题意:给出一棵树,树的边上都有边权值,求从一点出发的权值和最大,权值为从一点出去路径上边权的最小值 边权从大到小排序后  每次合并 取总权值最大的为父亲节点 #include <cstdio&g ...

  9. 树形结构 —— 并查集

    [概述] 并查集(Union-Find Set)是一种用于分离集合操作的抽象数据类型,其处理的是集合(set)之间的关系,一般处理的是图的连通分量,当给出两个的元素的一个无序对 (a,b) 时,需要快 ...

最新文章

  1. WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
  2. android 新特性笔记
  3. 【深入浅出MyBatis系列十一】缓存源码分析
  4. Java核心(三):代码块的作用
  5. 2012年12月第二个周末
  6. 关于Typora编辑器编写markdown文档时插入出现前字吞后字的解决方法
  7. android 手机固定mac地址吗,Android手机获取Mac地址的几种方法
  8. 统计学习方法 --- 感知机模型原理及c++实现
  9. 浏览器通知--window.Notification
  10. MAC编译出错:Undefined symbols for architecture x86_64: “_CFRelease“, referenced from:
  11. 【背包问题】基于matlab模拟退火算法求解背包问题【含Matlab源码 108期】
  12. java的实例变量_JAVA语言中的实例变量
  13. jquery的ajax方法实例,jquery的ajax方法实例教程
  14. 如何使用SMART原则
  15. 【ACWing】1123. 铲雪车
  16. CF446C DZY Loves Fibonacci Numbers 万能的线段树
  17. python程序员面试宝典:12个Python程序员面试必备问题与答案
  18. 做 UI 设计用PS还是AI?都不建议!
  19. 2018数学建模国赛回顾(国一)
  20. icp光谱仪的工作原理_ICP2060T ICP光谱仪工作原理

热门文章

  1. 一种快速的公交专用车道检测方法
  2. Linux组管理和权限管理
  3. DDoS高防(国际)子产品发布,替代原本在DDoS高防IP中的海外线路。
  4. 一些知识点的整理以及面试题记录
  5. springMVC学习-day01
  6. 《算法设计》二、算法分析基础
  7. Hyper-V的实验安装----1
  8. linux内核中的数据结构
  9. 大数据学习之路(七)——学习小结
  10. 自动化运维之PSSH