题意:有一张无向图,一些点之间有有权边,某条路径的值等于路径上所有边的边权的最大值,而某个点对的值为这两点间所有路径的值的最小值,给出多个询问,每个询问有一个值,询问有多少点对满足其值小于等于询问值。点的顺序不同算作不同点对。

这题的做法很类似Kruskal算法。一开始所有的点都为一个并查集,从权值最小的边开始,当加入这条边的时候,这条边连接的两个点(并查集)之间相互到达的路径中,值最小的一个路径一定就是通过这条边的,所以这两点间的值就是这条边的权值。之后每加入一条最小边,如果可以用来合并两个并查集,那么这两个并查集中的点相互到达的值一定是这条边的边权,因为我们取出的是边权最小的一条边,之前边权更小的边并没有使这两个并查集连通,而剩余边的话边权又比当前的边的边权大,因此得证,所以符合这个值的答案数就会加上这两个并查集的点数的乘积的两倍。这样这题就能够解决了。首先将边按权值、询问按询问值排序,再通过边合并并查集,合并过程中顺便将符合当前边权的询问赋值,这样就能离线处理出所有询问了。只不过我当时做的时候因为初始化的时候写小了,导致WA了五法……

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=;
const int maxp=;
const int maxm=1e5+; struct seg{
int a,b,v;
bool operator < (const seg a)const{
return v<a.v;
}
}s[maxm]; struct peo{
int num,v,cnt;
bool operator < (const peo a)const{
return v<a.v;
}
}p[maxp]; int n,m;
int fa[maxn],num[maxn],ans[maxp];
int nnum[]; void init(){
for(int i=;i<=n;i++){fa[i]=i;num[i]=;}
memset(ans,,sizeof(ans));
memset(p,,sizeof(p));
} int find(int x){
int r=x,t;
while(fa[r]!=r)r=fa[r];
while(x!=r){
t=fa[x];
fa[x]=r;
x=t;
}
return r;
} int main(){
int T;
scanf("%d",&T);
while(T--){
int k;
scanf("%d%d%d",&n,&m,&k);
init();
for(int i=;i<=m;++i)scanf("%d%d%d",&s[i].a,&s[i].b,&s[i].v);
int maxx=;
for(int i=;i<=k;++i){
scanf("%d",&p[i].v);
p[i].num=i;
if(p[i].v>maxx)maxx=p[i].v;
}
sort(s+,s+m+);
int pos=;
int aans=;
memset(nnum,,sizeof(nnum));
for(int i=;i<=m;++i){
int x=find(s[i].a),y=find(s[i].b);
if(x!=y){
int nx=num[x],ny=num[y];
aans+=nx*ny;
nnum[s[i].v]+=nx*ny*;
fa[x]=y;
num[y]+=num[x];
}
}
for(int i=;i<=maxx;++i)nnum[i]+=nnum[i-];
for(int i=;i<=k;++i)printf("%d\n",nnum[p[i].v]);
}
return ;
}

hdu5441(2015长春赛区网络赛1005)类最小生成树、并查集的更多相关文章

  1. hdu5443(2015长春赛区网络赛1007)暴力

    题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. #include< ...

  2. hdu5442(2015长春赛区网络赛1006)后缀数组+KMP /最小表示法?

    题意:给定一个由小写字母组成的长度为 n 的字符串,首尾相连,可以从任意一个字符开始,顺时针或逆时针取这个串(长度为 n),求一个字典序最大的字符串的开始字符位置和顺时针或逆时针.如果有多个字典序最大 ...

  3. hdu5438(2015长春赛区网络赛1002)拓扑序+DFS

    题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...

  4. zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)

    题意:给出一棵树,找出一个点,求出所有点到这个点的权值和最大,权值为路径上所有边权的最小值. 用神奇的并查集,把路按照权值从大到小排序,然后用类似Kruskal的方法不断的加入边. 对于要加入的一条路 ...

  5. HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)

    Count The Pairs Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  6. hdu 4274 2012长春赛区网络赛 树形dp ***

    设定每个节点的上限和下限,之后向上更新,判断是否出现矛盾 #include<cstdio> #include<iostream> #include<algorithm&g ...

  7. hdu 4277 2012长春赛区网络赛 dfs+hashmap ***

    hashmap判重大法好 #include<cstdio> #include<iostream> #include<algorithm> #include<c ...

  8. hdu 4273 2012长春赛区网络赛 三维凸包中心到最近面距离 ***

    新模板 /* HDU 4273 Rescue 给一个三维凸包,求重心到表面的最短距离 模板题:三维凸包+多边形重心+点面距离 */ #include<stdio.h> #include&l ...

  9. hdu 4272 2012长春赛区网络赛 dfs暴力 ***

    总是T,以为要剪枝,后来发现加个map就行了 #include<cstdio> #include<iostream> #include<algorithm> #in ...

随机推荐

  1. dataTable/dataSet转换成Json格式

    using System.Text;using System.Collections.Generic; 1)dataTable转Json(表格有名称:dt.TableName) public stat ...

  2. C语言中输入输出函数

    1.1.1 格式化输入输出函数Turbo C2.0 标准库提供了两个控制台格式化输入. 输出函数printf() 和scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据.pri ...

  3. 计算文字的高度和宽度--以微博会话界面中用户名(userName)为例

    所用方法 // NOTE: All of the following methods will default to drawing on a baseline, limiting drawing t ...

  4. iOS:图片拉伸不变形技巧

    方法: 假设图片为60*24 CGFloat top = image.height*0.5-1; // 顶端盖高度 CGFloat bottom = top ; // 底端盖高度 CGFloat le ...

  5. Visual Studio 2013 Update 2 and with Update 2

    Microsoft 的开发工具 Visual Studio 2013 迎来 Update2 更新.本次更新将为普通开发者带来更多全新功能.修复之前旧版 Bugs.提升性能以及稳定性.之前已经安装 VS ...

  6. swift语言开发的一个游戏------熊猫跑酷(KongfuPanda)

    项目地址:https://github.com/jakciehoo/KongfuPanda 欢迎加QQ群:260558552.大家一起交流iOS开发,我们可以一起学习,我很想集结一些志同道合的朋友,一 ...

  7. java基础-005

    27.Java中垃圾回收的目的及回收的时机 垃圾回收的目的是识别并且丢弃不再使用的对象来释放和重用资源. 如果对象的引用被置为null,垃圾收集器不会立即释放对象占用的内存. 什么时候进行垃圾回收,主 ...

  8. XAMPP启动mysql遇到的问题

    Version: '10.1.9-MariaDB' socket: '' port: 3306 mariadb.org binary distribution2016-07-18 10:42:04 1 ...

  9. HDU 4737 A Bit Fun

    题意:定义F(i,j)为数组a中从ai到aj的或运算,求使F(i,j)<m的对数. 思路:或运算具有单调性,也就是只增不减,如果某个时刻结果大于等于m了,那么再往后一定也大于等于m.所以可以用两 ...

  10. kali linux karmetasploit配置

    原理分析:http://www.freebuf.com/articles/77055.html 转官方说明:https://www.offensive-security.com/metasploit- ...