并查集 HDOJ 5441 Travel
题意:给一张无向图,问存在多少(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;
- }
并查集 HDOJ 5441 Travel的更多相关文章
- 并查集 HDOJ 1232 畅通工程
题目传送门 /* 并查集(Union-Find)裸题 并查集三个函数:初始化Init,寻找根节点Find,连通Union 考察:连通边数问题 */ #include <cstdio> #i ...
- hdu 5441 Travel 离线带权并查集
Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...
- hdu 5441 travel 离线+带权并查集
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Descript ...
- Travel(HDU 5441 2015长春区域赛 带权并查集)
Travel Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- HDU 5441 Travel(并查集+统计节点个数)
http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...
- HDU 5441——Travel——————【并查集+二分查界限】
Travel Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- HDU 5441 Travel (并查集+数学+计数)
题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- 【BZOJ-1576】安全路径Travel Dijkstra + 并查集
1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1044 Solved: 363[Sub ...
随机推荐
- 继承LinearLayout实现根据屏幕宽度及内部子View个数自动排布GridView
public class VerticalSearchGridView extends LinearLayout implements View.OnClickListener { private i ...
- sql insert and update
1 二者的区别 insert是插入一条新的数据,它会创建一条新的记录:update是更新一条已经有的数据,它不会创建新的记录. update需要where来指示更新那条记录,否则会更新所有的记录. 2
- pyspark 连 MongoDB复制集
解决问题思路: 核心:0-理解pyspark的执行与java jar的关系: 1-看控制台,看日志: 2-jar缺不缺,版本号,放哪里. [root@hadoop1 mylocalRepository ...
- SAP图标- ICON
- 用WaveX实现音频文件的录音
原文地址:https://blog.csdn.net/gongluck93/article/details/53096013 1.WaveInOpen waveInOpen MMRESULT wave ...
- SpringBoot配置文件详解
自定义属性与加载 com.dongk.selfproperty.title=wangdkcom.dongk.selfproperty.name=10000 然后通过@Value("${属性名 ...
- POJ1094 Sorting It All Out —— 拓扑排序
题目链接:http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Tot ...
- 简单的JDBC编程步骤
1.加载数据库驱动(com.mysql.jdbc.Driver) 2.创建并获取数据库链接(Connection) 3.创建jdbc statement对象(PreparedStatement) 4. ...
- 非常精彩的Silverlight 2控件样式
概述 大家是否觉的现在Silverlight 2提供的默认的控件不能满足自己的要求?好在Silverlight的控件可以运用皮肤,微软Silverlight控件的设计者的主管Corrina开发了几套非 ...
- ubuntu 源、codename 与 sources.list 文件
查看 codename $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubunt ...