Travel

Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 1852    Accepted Submission(s): 641

Problem Description
Jack likes to travel around the world, but he doesn’t like to wait. Now, he is traveling in the Undirected Kingdom. There aren
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?
 
Input
The first line contains one integer
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.


 
Output
You should print q
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.
 
Sample Input
1
5 5 3
2 3 6334
1 5 15724
3 5 5705
4 3 12382
1 3 21726
6000
10000
13000
 
Sample Output
2
6
12
 
Source
 
Recommend
hujie

通过并查集计算新加入的,每次的计算公式为原来的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(最小生成树&& 并查集)的更多相关文章

  1. UVA 1395 苗条的生成树(最小生成树+并查集)

    苗条的生成树 紫书P358 这题最后坑了我20分钟,怎么想都对了啊,为什么就wa了呢,最后才发现,是并查集的编号搞错了. 题目编号从1开始,我并查集编号从0开始 = = 图论这种题真的要记住啊!!题目 ...

  2. CSP 201703-4 地铁修建【最小生成树+并查集】

    问题描述 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市 ...

  3. HDU 5441——Travel——————【并查集+二分查界限】

    Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

  4. 【BZOJ-1576】安全路径Travel Dijkstra + 并查集

    1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1044  Solved: 363[Sub ...

  5. 关于最小生成树(并查集)prime和kruskal

    适合对并查集有一定理解的人.  新手可能看不懂吧.... 并查集简单点说就是将相关的2个数字联系起来 比如 房子                      1   2    3   4  5   6 ...

  6. 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)

    Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...

  7. bzoj 3559: [Ctsc2014]图的分割【最小生成树+并查集】

    读题两小时系列-- 在读懂题意之后,发现M(c)就是c这块最大权割边也就是的最小生成树的最大权边的权值,所以整个问题都可以在MST的过程中解决(M和c都是跟着并查集变的) 不过不是真的最小生成树,是合 ...

  8. HDU5441 Travel 离线并查集

    Travel Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, ...

  9. HDU 5441 Travel (并查集+数学+计数)

    题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...

随机推荐

  1. angularjs实现IOS8自带计算器

    最近看到一则面试题目,要求使用angularjs实现一个计算器,利用放假时间实现了一个仿iOS8风格的计算器,功能基本和iOS自带的计算器是一致的. 查看demo,接着给出实现过程. 首先创建angu ...

  2. 在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试(初级篇) 在Eclipse中使用JUnit4进行单元测试(中级篇) 在Eclipse中使用JUnit4进行单元测试(高级篇)

  3. HiveQ与传统SQL差异

    1.   hive内连接支持什么格式? • SQL中对两表内联可以写成:        select * from dual a,dual b where a.key = b.key; 或者: SEL ...

  4. [spring security] spring security 4 基础Demo

    依赖包: <properties> <junit.version>4.11</junit.version> <spring.version>4.1.6. ...

  5. 查看.Net Framework版本的方法

    乐博网最新补充(乐博网一步步教你如何最快查看本机.net framework的版本): 方法一: 第一步: 打开“我的电脑“,在地址栏输入  %systemroot%\Microsoft.NET\Fr ...

  6. 【linux】who&&w

    who和w 看到目前服务器所登陆的用户,区别是w能看到更详细的信息. [root@andon tmp]# who admin tty5[tty指本地登陆] 2016-05-27 15:16[登陆时间] ...

  7. IntelliJ IDEA常用快捷键

    双击shift 项目所有目录查找 ctrl+f 文件查找特定内容 ctrl+shift+f 项目查找包含特定内容的文件 ctrl+n 新建类 ctrl+shift+n 查找文件 ctrl+e  最近的 ...

  8. golang一个深复制的库

    https://github.com/mitchellh/copystructure

  9. Softerra LDAP Browser 使用及配置 有图有真相

    Softerra LDAP Browser 4.5 我使用Softerra LDAP Browser的目的,是为了查找公司的人员信息.网上关于Softerra LDAP Browser配置太少了,所以 ...

  10. 【freemaker】之FreeMakerUtil工具类

    Freemaker生成文件常用工具类 public class FreemakerUtil { private static FreemakerUtil util; private static Co ...