搜了题解才把题搞明白。明白之后发现其实题意很清晰,解题思路也很清晰,只是题目表述的很不清晰……

大意如下——

给你一个无向图,图中任意两点的距离是两点间所有路径上的某一条边,这条边需要满足两个条件:1. 这条边这两点间某条路径上的最长边;2. 这条边是这两点间所有路径上的最长边中的最短边。

简单来说,假如a到d有两条路径,一条经过b,一条经过d,其中ab = 1, bd = 3, ac = 2, cd = 2,那么abd上的最长边为3,acd上的最长边为2,则ad的距离为2。

如果a, d两点间的距离小于能量L,那么就可以在a, d两点间建立一个传送门。

现在,求在L的能量下最多可以在这个图中建立多少个传送门。

输入:

多组输入数据。

每组输入数据第一行包括三个整数n, m, q。表示节点数,边数,请求数。

接下来m行,每行三个整数u, v, val,表示边的源点,目的点,边权(注意,是无向图,源点和目的点等价)。

接下来q行,每行一个整数L,表示请求所提供的能量。

解题核心:如果集合x与集合y不连通,而此时有一条路L'将x与y连通,且L' <= L,此时将可以建立新传送门num[x]*num[y]个,num[x]表示x集合中的节点数。L1连通后,将集合x与集合y合并,得到新集合x,num[x] += num[y],这就是并查集。

可以使用并查集+kruskal进行求解。即,将所有边从小到大排序,每次按顺序向并查集中增加新边,需要保证添加的新边不会构成环,直到边长>请求所提供的能量L。

新问题出现了,当我们在L1的能量下将路径求出来了,那么如果下一次请求能量为L2,那么我们无法在已有的并查集上继续求解,只能重新建立并查集,这将产生极大的浪费。所以,我们需要将请求L1——Lq全部记录下来,即离线操作,然后按照从小到大的顺序进行求解。最后在将解按照请求顺序排序输出。

上代码——

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const int M = ; struct Que //保存查询
{
int q, id, ans; //分别是查询值,查询顺序,输出结果
}que[M]; struct Edge //保存边
{
int u, v, val;
}edge[*M]; int fm[M]; //并查集使用
int sum[M]; //记录各区间节点数 int n, m, q; bool cmp(Edge x, Edge y)
{
return x.val <= y.val;
} bool cmp1(Que x, Que y)
{
return x.q <= y.q;
} bool cmp2(Que x, Que y)
{
return x.id < y.id;
} void init()
{
for(int i = ; i <= n; i++)
{
fm[i] = i;
sum[i] = ;
}
for(int i = ; i < m; i++) scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].val);
sort(edge, edge+m, cmp); //按路径长度从小到大排序 for(int i = ; i < q; i++)
{
scanf("%d", &que[i].q);
que[i].id = i;
que[i].ans = ;
}
sort(que, que+q, cmp1); //按请求长度从小到大排序
} int mfind(int x) //查询操作,含路径压缩
{
int fx = x;
while(fx != fm[fx]) fx = fm[fx];
while(x != fm[x])
{
int mid = fm[x];
fm[x] = fx;
x = mid;
}
return fx;
} void work()
{
int cnt = ;
for(int i = ; i < q; i++) //回应请求
{
while(que[i].q >= edge[cnt].val && cnt < m) //kruskal算法
{
int fx = mfind(edge[cnt].u);
int fy = mfind(edge[cnt].v);
if(fx != fy)
{
que[i].ans += sum[fx]*sum[fy]; //新增传送阵
fm[fy] = fx; //集合合并
sum[fx] += sum[fy];
}
cnt++;
}
if(i > ) que[i].ans += que[i-].ans; //包含已有传送阵
}
} void output()
{
sort(que, que+q, cmp2); //按请求顺序排序
for(int i = ; i < q; i++) printf("%d\n", que[i].ans);
} int main()
{
//freopen("test.txt", "r", stdin);
while(~scanf("%d%d%d", &n, &m, &q))
{
init();
work();
output();
}
return ;
}

hdu 3938 Portal(并查集+离线+kruskal)2011 Multi-University Training Contest 10的更多相关文章

  1. HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)

    Portal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  2. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  3. BZOJ5188: [Usaco2018 Jan]MooTube 并查集+离线处理

    BZOJ又不给题面... Luogu的翻译看不下去... 题意简述 有一个$n$个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你$Q$个询问,问你与点$v$的距离超过$k ...

  4. poj 2528 Mayor's posters 线段树 || 并查集 离线处理

    题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...

  5. ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)

    Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...

  6. HDU 3938:Portal(并查集+离线处理)

    http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Problem Description   ZLGG found a magic theor ...

  7. zoj3261 并查集离线处理

    Connections in Galaxy War Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & ...

  8. HDU 2818 (矢量并查集)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2818 题目大意:每次指定一块砖头,移动砖头所在堆到另一堆.查询指定砖头下面有几块砖头. 解题思路: ...

  9. BZOJ-1015 StarWar星球大战 并查集+离线处理

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 4105 Solved: 1826 [Submit ...

随机推荐

  1. 用 Xamarin for VS 创建 aar 文件的绑定

    预备工作:相关aar文件,Xamarin for VS一份.我这里以Android中挺火的 MaterialDesignLibrary 为例. 1.首先,创建一个Xamarin Binding Lib ...

  2. android 上下文菜单详解

    本文使用xml来创建上下文菜单 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:andr ...

  3. Struts2 本是非单例的,与Spring集成就默认为单例

    1.Struts2本身action类是多例,此设计的原因在于本身action担任了数据载体,如果做成单例,则会便多用户数据受到影响: 2.当Struts2 与 spring整合时,Struts2的Ac ...

  4. QQ拼音还是不行哇

    QQ拼音还是不行啊,虽说没广告,但是很多词条没有,例如知乎.蒋京虎. 泰囧……

  5. kmeans理解

    最近看到Andrew Ng的一篇论文,文中用到了Kmeans和DL结合的思想,突然发现自己对ML最基本的聚类算法都不清楚,于是着重的看了下Kmeans,并在网上找了程序跑了下. kmeans是unsu ...

  6. window下安装composer and yii2

    我的环境是集合包xampp 1,下载composer:下载地址https://getcomposer.org/download/, 点击蓝色字体“Composer-Setup.exe” 2,安装com ...

  7. 利用纯真ip地址库 查询 ip所属地

    1. 首先下周数据源,选择是纯真数据库:http://www.cz88.net/ 2. 安装后,打开软件,将数据导出为txt格式. 3. 处理数据,参照网上的文章(http://www.jb51.ne ...

  8. 10、JPA_映射双向多对多的关联关系

    双向多对多的关联关系 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也有对A的集合的引用.A.B两个实体对应的数据表靠一张中间表来建立连接关系. 同时我们还知道,双向多对 ...

  9. 转TerreyLee AJAX入门系列2——ScriptManager的理解总结

    ScriptManager的功能之一就是处理页面上局部更新,对于这点,我想大家都知道.但是他工作的原理到底是什么呢,这个暂且不从正面来回答. 我们这样想一下,目前能够真正实现局部刷新的就是js+xml ...

  10. The type sun.management.ManagementFactory is not visible

    Eclipse默认将这些受访问限制的API设成了Error.解决方法:只要将Windows---Preferences---Java--Complicer---Errors/Warings里面的Dep ...