题目传送门

题意:给一张无向图,问存在多少(a, b)表示a点到b点经过的边值小于等于x ((a,b) 和 (b, a)属于不同的方案)

分析:首先将边权值和查询x值升序排序,从前往后扫描边,累加从u和v两个集合各自选取一个组成(a, b)的方案数(u,v属于不同的集合),不能从一个集合选两个,因为同一个集合的方案数已经计算过了。然后将u和v合并到一个集合,在O (m) 复杂度得到答案

收获:并查集真是个很好的数据结构

代码:

/************************************************* Author        :Running_Time* Created Time  :2015/9/13 星期日 17:55:11* File Name     :E.cpp************************************************/#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 2e4 + 10;
const int M = 1e5 + 10;
const int Q = 5e3 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
struct UF   {int rt[N], rk[N];void init(void) {memset (rt, -1, sizeof (rt));memset (rk, 0, sizeof (rk));}int Find(int x) {return rt[x] == -1 ? x : rt[x] = Find (rt[x]);}void Union(int x, int y)    {x = Find (x), y = Find (y);if (x == y) return ;if (rk[x] > rk[y])  {rt[y] = x;  rk[x] += rk[y] + 1;}else    {rt[x] = y;  rk[y] += rk[x] + 1;}}bool same(int x, int y) {return Find (x) == Find (y);}
}uf;
struct Edge {int u, v, w;bool operator < (const Edge &r) const   {return w < r.w;}
}edge[M];
struct Query    {int x, id;bool operator < (const Query &r) const  {return x < r.x;}
}q[Q];
ll ans[Q];int main(void)    {int T;  scanf ("%d", &T);while (T--) {int n, m, k;scanf ("%d%d%d", &n, &m, &k);for (int i=1; i<=m; ++i)    {scanf ("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);}sort (edge+1, edge+1+m);for (int i=1; i<=k; ++i)    {scanf ("%d", &q[i].x);  q[i].id = i;}sort (q+1, q+1+k);memset (ans, 0, sizeof (ans));uf.init (); int j = 1;  ll sum = 0;for (int i=1; i<=k; ++i)    {while (j <= m && q[i].x >= edge[j].w)   {int u = edge[j].u, v = edge[j].v;if (uf.same (u, v)) {++j;    continue;}u = uf.Find (u), v = uf.Find (v);sum += (uf.rk[u] + 1) * 1ll * (uf.rk[v] + 1);uf.Union (u, v);    ++j;}ans[q[i].id] = sum;}for (int i=1; i<=k; ++i)    {printf ("%I64d\n", ans[i] * 2);}}return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/4806682.html

并查集 HDOJ 5441 Travel相关推荐

  1. 并查集 HDOJ 1232 畅通工程

    题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...

  2. HDU - 5441 Travel 离线处理+并查集

    题意 给我们一个图 给出这个图的n个点 和m个边和权值 然后再分别给我们q个查询 每个查询给一个x 让我们在这个图中找出多少个不同的有序对 使得从x到y的最大权值不超过x n≤20000,m≤1000 ...

  3. HDU 5441并查集 by cyl

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

  4. UVA 11165 - Galactic Travel(BFS+twopointer+并查集)

    UVA 11165 - Galactic Travel 题目链接 题意:给定一些不能走的边,要求出从s到t的最短路 思路:由于点数多,直接广搜会超时,所以加上优化,已经找过的点就不在重复找了,这点可以 ...

  5. hdu 5441 (并查集)

    题意:给你n个点,m条边构成无向图.q个询问,每次一个值,求有多少条路,路中的边权都小于这个值 a->b 和 b->a算两种 思路:把权值从小到大排序,询问从小到大排序,如果相连则用并查集 ...

  6. HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...

  7. 路径空间HDOJ 4514 - 湫湫系列故事——设计风景线 并查集+树型DP

    最近研究路径空间,稍微总结一下,以后继续补充: 题意有没说楚清的...两点间最多一条路径.... 先用并查集检查无向图否是有环... 若干个无环的无向图就是一丛林了... 那么目题转化为在一棵树上找最 ...

  8. HDU5441 Travel 有秩并查集

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others)     ...

  9. HDOJ 畅通工程 1232(并查集入门)

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

最新文章

  1. SD VC - 变式价格
  2. python的前端框架_web前端三大主流框架之Python异步框架如何工作?
  3. python2和python3的不同点_Python2和Python3的区别,新手学习Python应该如何选择
  4. 报错空指针异常_让你为之颤抖的Java常见的异常exception
  5. Android之如何解决Listview里面的值出现了2次
  6. mysql增加表中数值的sql语句_sql语句--MySql添加表数据
  7. 自定义页面hashmap 方便调用
  8. Oracle Net
  9. 【飞行器】基于matlab GUI四旋翼飞行器飞行模拟【含Matlab源码 1183期】
  10. ASCII码(C语言)
  11. 目标客户画像_用户画像(1)用户画像的概念、意义和目标
  12. 微信小程序-wxs实现时间格式化过滤器(正则)
  13. win10安装ePLAN P8 2.7无法通过驱动精灵更新MultiUSB Key驱动问题的解决办法
  14. php 应用截图,PHP应用:php使用CutyCapt实现网页截图保存的方法
  15. HDFS ACLs访问控制权限
  16. 利用Office PPT录制演示视频
  17. ANSYS经典界面出图技巧总结
  18. 二:统计基础:描述统计
  19. 【300+精选大厂面试题持续分享】大数据运维尖刀面试题专栏(十五)
  20. PLM系统的技术现状和发展趋势

热门文章

  1. oracle 14108,ORA-14108:非法分区扩展表名的语法
  2. 北京交通大学计算机科学与技术研究生导师,熊轲_北京交通大学研究生导师信息...
  3. 蓝桥杯真题 a组 java_2014蓝桥杯决赛A组第5题(java)
  4. android选择下拉框的默认值,如何在Android中将默认值设置为微调器下拉列表?
  5. FPGA从Xilinx的7系列学起(6)
  6. C++应用程序性能优化(三)——C++语言特性性能分析
  7. Python入门篇-数据结构堆排序Heap Sort
  8. 跟着“路线图”,我们一起遨游机器学习的世界!
  9. 为什么越来越多的人都不再愿意做程序员了?
  10. 最新版,别的可以不用看了,zabbix 监控 esxi