题意:给你n个点,m条边构成无向图。q个询问,每次一个值,求有多少条路,路中的边权都小于这个值

a->b 和 b->a算两种

思路:把权值从小到大排序,询问从小到大排序,如果相连则用并查集相连形成联通块

x个点可以形成:x * (x - 1)

如果新增的路使两个联通块和并则数量 增长了:

(num[1]+num[2])×(num[1]+num[2]-1) - num[1] × (num[1]-1) - num[2] ×(num[2]-1)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
int T,n,m,k;
int num[20005],par[20005],p[20005];struct node
{int u,v,w;bool operator<(const node&a)const{return w < a.w;}
} pnode[100005];struct term
{int id,we;bool operator<(const term&a)const{return we<a.we;}
} te[20005];int fin(int x)
{return x == par[x]?  x : par[x] = fin(par[x]);
}void merg(int x,int y)
{int x1 = fin(x);int x2 = fin(y);if(x1 < x2){par[x2]= x1;num[x1] += num[x2];}else{par[x1] = x2;num[x2] += num[x1];}
}int main()
{scanf("%d",&T);while(T--){scanf("%d%d%d",&n,&m,&k);for(int i = 0; i <= n; i++){par[i] = i;num[i] = 1;}for(int i = 0; i < m; i++)scanf("%d%d%d",&pnode[i].u,&pnode[i].v,&pnode[i].w);sort(pnode,pnode+m);for(int i = 0; i < k; i++){te[i].id = i;scanf("%d",&te[i].we);}sort(te,te+k);int tt = 0;ll ans = 0;for(int i = 0; i < k; i++){while(tt < m &&  pnode[tt].w <= te[i].we ){int u = fin(pnode[tt].u);int v = fin(pnode[tt].v);tt++;if(u == v)continue;ans += (num[u]+num[v])*(num[u]+num[v]-1)-num[u]*(num[u]-1) - num[v]*(num[v]-1);merg(u,v);}p[te[i].id] = ans;}for(int i = 0;i <k;i++)printf("%d\n",p[i]);}return 0;
}

  

转载于:https://www.cnblogs.com/Przz/p/5409758.html

hdu 5441 (并查集)相关推荐

  1. HDU 5441并查集 by cyl

    HDU 5441 题意: ​ 杰克喜欢旅游,从城市a到城市b是他最喜欢的,现在有n个城市m个路. ​ 当杰克在从城市a到城市b 的时候需要坐车,但是需要有等待时间t,他无法忍受超过x 的等待时间. ​ ...

  2. hdu 5606(并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5606 解题思路: 这题实际上是要找一些连通的节点,使得边上的权值都为0. 很明显,首先把权值为0的边都 ...

  3. hdu 1232 并查集

    并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) ...

  4. hdu 4907(并查集)

    Task schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Pr ...

  5. hdu 2473(并查集+删除操作)

    解题思路:这道题有并查集的删除操作,如果直接对这一棵树进行删除节点操作肯定是很困难的.所以可以建立虚拟节点,只要有一个节点要被删除,就直接把它投影到虚拟节点上,即用这个虚拟节点来代替我们要删除的节点. ...

  6. hdu 3172(并查集+hash)

    解题思路:典型的并查集,只是每个人的名字要转换成数字,可以用map,也可以用字典树,我最开始用的字典树结果爆内存了.. 爆内存: #include<iostream> #include&l ...

  7. hdu 3081(并查集+最大流)

    题目大意: n个男孩n个女孩,女孩选男孩,每个女孩都要选到不同的人 k对女孩有相同选择标准, 女孩每轮都选择没选过的男孩, 问总共能选几轮.解题思路:女孩编号1......n,男孩编号n+1,n+2, ...

  8. hdu 2545 并查集

    题目描述:给定一个无向图,判断这个图是否满足任意两点之间有且仅有一条通路. 思路:并查集,若a和b之间有一条边且处于不同的集合中,则将a和b所在集合合并:若a和b本就在同一集合中(有一条通路),则加上 ...

  9. hdu 1856 并查集——ac的不一定正确

    这次深深体会到ac的代码不一定正确.呵呵.cry_mas前一段才和我说起.我还半信半疑.话说好久以前他就说过类似的话,当时水平太菜了.现在深深体会到ac的代码不一定正确.这要坑死了啊,正式比赛碰到真是 ...

最新文章

  1. 网红快餐店_在一家快餐店工作解释了AJAX基础知识
  2. drupal建设多语言站点之四:不同语言的站点名称
  3. TCP/IP详解--学习笔记(11)-TCP交互数据流,成块数据流
  4. html中dir标签的作用是什么意思,htmldir标签是干啥的?dir标签的具体定义和属性介绍...
  5. 光华科技光刻胶_【收藏】6天5板!21只光刻胶概念(名单)“出炉”!
  6. jsp内置对象(四)-----session对象
  7. 减治求有重复元素的全排列
  8. linux集群应用实战(更新完毕)
  9. .$nextTick 延迟回调
  10. Uber七折流血融资,软银拿下15%股份,滴滴笑了
  11. 卡巴斯基2009注册机[纯绿色版本]
  12. 具象化Magento第一章【1.1】
  13. java银生宝接口开发_银生宝代付和网关渠道
  14. oracle column name as sign,Oracle日常性能查看 - ella的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  15. 天眼查 Authorized和企查查 sign破解
  16. Houdini学习笔记——【案例二】消散文字制作
  17. matlab模拟调制过程,用Matlab模拟SSB调制波形及解调过程
  18. 经济寒冬背景下,企业如何利用OA系统保暖
  19. 国内8大热门android论坛
  20. 质检员根据检索报告中A类文献

热门文章

  1. .net的轻量级ORM -- PetaPoco/NPOCO框架使用说明
  2. ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台(elk5.2+filebeat2.11)
  3. Python中处理DataFrame,R绘图
  4. install yael on the ubuntu 12.04
  5. asp.net生成jason给js
  6. linux查看fcsan设备,fc-san存储
  7. java版本号分段比较_Java实现比较版本号
  8. 使用docker安装elasticsearch
  9. Windows 令人“社死”的新功能,你都知道吗?
  10. 后端技术:mybatis插件原理详解