Regional Changchun Online--Travel(最小生成树&& 并查集)
Travel
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1852 Accepted Submission(s): 641
cities and m
bidirectional roads connecting the cities. Jack hates waiting too long on the bus, but he can rest at every city. Jack can only stand staying on the bus for a limited time and will go berserk after that. Assuming you know the time it takes to go from one city
to another and that the time Jack can stand staying on a bus is
x
minutes, how many pairs of city (a,b)
are there that Jack can travel from city a
to b
without going berserk?
T,T≤5,
which represents the number of test case.
For each test case, the first line consists of three integers
n,m
and q
where n≤20000,m≤100000,q≤5000.
The Undirected Kingdom has n
cities and m
bidirectional roads, and there are q
queries.
Each of the following m
lines consists of three integers a,b
and d
where a,b∈{1,...,n}
and d≤100000.
It takes Jack d
minutes to travel from city a
to city b
and vice versa.
Then q
lines follow. Each of them is a query consisting of an integer
x
where x
is the time limit before Jack goes berserk.
lines for each test case. Each of them contains one integer as the number of pair of cities(a,b)
which Jack may travel from a
to b
within the time limit x.
Note that (a,b)
and (b,a)
are counted as different pairs and a
and b
must be different cities.
1
5 5 3
2 3 6334
1 5 15724
3 5 5705
4 3 12382
1 3 21726
6000
10000
13000
2
6
12
通过并查集计算新加入的,每次的计算公式为原来的s+合并后的两个集合数量乘积。。。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string>
#include <queue>
#include <string.h>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
#include <stdlib.h>
using namespace std;
#define eps 1e-8
#define INF 20000000005
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z);
#define rdLL(x) scanf("%I64d",&x)
#define MAXn 20005
#define MAXe 100005
#define QUEnum 5005
struct Node{
int sta,end,val;
}node[MAXe]; struct Que{
int queval , num;
}que[QUEnum]; int sett[MAXn]; int sett_find(int x)
{
if(sett[x]<0) return x;
return sett[x]=sett_find(sett[x]);
} bool cmp1(Node a,Node b){
return a.val<b.val;
} bool cmp2(Que a,Que b){
return a.queval<b.queval;
}
int main ()
{
int Case;
rd(Case);
while(Case--)
{
memset(sett,-1,sizeof(sett));
int sum[MAXn];
int res[QUEnum];
for(int i=0;i<MAXn;i++) sum[i]=1;
int n,e,quenum;
rd3(n,e,quenum); for(int i=0;i<e;i++)
rd3(node[i].sta,node[i].end,node[i].val); sort(node,node+e,cmp1); ///这里的排序不是+n 而是e 找了两个小时
for(int i=0;i<quenum;i++) {
rd(que[i].queval);
que[i].num=i;
} sort(que,que+quenum,cmp2);
int j=0,s=0; ///计数有多少能到达
for(int i=0 ; i<quenum ;i++) ///不能在这里添加j<e,因为大于的还需要计算
{
while( j<e && node[j].val <= que[i].queval ){
int a=node[j].sta,b=node[j].end; int p = sett_find(a);
int q = sett_find(b);
if(p!=q){
s += (sum[q]*sum[p]); ////((sum[q]*(sum[q]+1))>>1) - ((sum[p]*(sum[p]+1))>>1) +
sett[q] = p;
sum[p]=sum[q]+sum[p]; ///p作为根节点
}
j++;
}
res[ que[i].num ] = (s<<1);
}
for(int i=0;i<quenum;i++)
printf("%d\n",res[i]);
}
return 0;
}
Regional Changchun Online--Travel(最小生成树&& 并查集)的更多相关文章
- UVA 1395 苗条的生成树(最小生成树+并查集)
苗条的生成树 紫书P358 这题最后坑了我20分钟,怎么想都对了啊,为什么就wa了呢,最后才发现,是并查集的编号搞错了. 题目编号从1开始,我并查集编号从0开始 = = 图论这种题真的要记住啊!!题目 ...
- CSP 201703-4 地铁修建【最小生成树+并查集】
问题描述 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市 ...
- HDU 5441——Travel——————【并查集+二分查界限】
Travel Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- 【BZOJ-1576】安全路径Travel Dijkstra + 并查集
1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1044 Solved: 363[Sub ...
- 关于最小生成树(并查集)prime和kruskal
适合对并查集有一定理解的人. 新手可能看不懂吧.... 并查集简单点说就是将相关的2个数字联系起来 比如 房子 1 2 3 4 5 6 ...
- 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)
Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...
- bzoj 3559: [Ctsc2014]图的分割【最小生成树+并查集】
读题两小时系列-- 在读懂题意之后,发现M(c)就是c这块最大权割边也就是的最小生成树的最大权边的权值,所以整个问题都可以在MST的过程中解决(M和c都是跟着并查集变的) 不过不是真的最小生成树,是合 ...
- HDU5441 Travel 离线并查集
Travel Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, ...
- HDU 5441 Travel (并查集+数学+计数)
题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...
随机推荐
- [Hibernate] - many to one
Hibernate的多对一操作: 例子参考引用: http://www.tutorialspoint.com/hibernate/hibernate_many_to_one_mapping.htm h ...
- Java与.NET兼容的RSA密钥持久化方法
默认情况下,.NET生成的RSA密钥对可以用XML或字节流来保存,而JAVA中生成的RSA密钥对只能用字节流来保存.而它们的字节流格式不同,就导致Java中生成的RSA密钥对不能在.NET中使用,而. ...
- cocoapods的安装及注意事项
cocoapods是运行在ruby环境下的,在ruby环境的 ,像cocoapods这样的开源项目时放在放在rubygems服务器上面的,但国内访问https://rubygems.org/ 的时候会 ...
- 【linux】find命令详解
find命令格式:find [搜索范围][匹配条件] -name 参数:按照名字查找 [root@andon ~]# find /root -name test ###精确查找 /root/test ...
- bzoj1536: [POI2005]Akc- Special Forces Manoeuvres
Description 在一次军事行动中有一批空降兵要降落在沙漠中拆除炸弹. 空降兵按照预定的顺序跳伞并降落到指定的位置.一旦降落他们便呆在原地不动了. 每个空降兵都有一个生存半径. 如果炸弹与他的距 ...
- CFLAGS,CPPFLAGS,CXXFLAGS in Makefile
CC 与 CXX: 这是 C 与 C++ 编译器命令.默认值一般是 “gcc” 与 “g++”. CPPFLAGS will be given to the C preprocessor ...
- 黄聪:WordPress动作钩子函数add_action()、do_action()源码解析
WordPress常用两种钩子,过滤钩子和动作钩子.过滤钩子相关函数及源码分析在上篇文章中完成,本篇主要分析动作钩子源码. 然而,在了解了动作钩子的源码后你会发现,动作钩子核心代码竟然跟过滤钩子差不多 ...
- Mongodb(1)如何存储以及简介
在学习一个数据库之前应该了解这个数据库是如何存储的,是不是适合你所需要的存储方式. 如果上来就说命令,理解起来似乎有点麻烦. 不管学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是 ...
- java_ _反射
Java语言的反射机制初步学习 首先看下基本概念: (一)在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取 ...
- HDFS的运行原理(转)
简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Go ...