Travel

Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2055    Accepted Submission(s): 709

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 are n 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
 
题意:q次查询,在n个城市找出之间从一个城市到另一个城市所花时间小于d的城市对数。
思路:一个城市到另一个城市所花时间小于d集合合并。由于时间限制,要离线操作。个人理解,相当于就是打表。
收获:自己思维漏洞好多,要保持程序的健壮性。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>
using namespace std; const int INF=0x3f3f3f3f;
const double eps=1e-;
const double PI=acos(-1.0);
#define maxn 5500
#define maxx 26000
#define maxm 160000 struct Edge
{
int u,v,w;
}edge[maxm];
struct Id
{
int s, id;
}ans[maxn];
int n,cnt1; int root[maxx],num[maxx],cnt[maxn];
int vis[maxx]; int cmp(Edge a,Edge b)
{
return a.w < b.w;
}
int cmp1(Id a, Id b)
{
return a.s < b.s;
}
int cmp2(Id a, Id b)
{
return a.id < b.id;
}
void init()
{
for(int i = ; i <= n; i++)
{
root[i] = i;
num[i] = ;
}
}
int find_root(int x)
{
if(x != root[x])
root[x] = find_root(root[x]);
return root[x];
}
int cot;
void uni(int a, int b)
{
int x = find_root(a);
int y = find_root(b);
if(x != y)
{
root[y] = x;
int p1 = num[x];
int p2 = num[y];
cot -= p1*(p1-);
cot -= p2*(p2-);
num[x] += num[y];
cot += num[x] * (num[x]-);
num[y] = ;
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int m,q;
scanf("%d%d%d", &n, &m, &q);
for(int i = ; i < m; i++)
scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
init();
sort(edge, edge+m, cmp);
for(int i = ; i < q; i++)
{
scanf("%d", &ans[i].s);
ans[i].id = i;
}
sort(ans, ans+q, cmp1);
memset(vis, , sizeof vis);
cnt1 = ;
int cnt2 = ;
cot = ;
//memset(cnt, 0, sizeof cnt);
for(int i = ; i < m; i++)
{
if(cnt2 == q)
break;
// if(edge[i].w <= ans[cnt2].s)
// uni(edge[i].u, edge[i].v);
// else
for(int j = cnt2; cnt2 < q; cnt2++)
{
if(edge[i].w <= ans[cnt2].s)
{
uni(edge[i].u, edge[i].v);
break;
}
ans[cnt2].s = cot;
} }
int temp;
if(cnt2 == )
temp = cot;
else
temp = ans[cnt2-].s;
if(cnt2<q)
for(int i = cnt2; i < q; i++)
ans[i].s = temp; sort(ans, ans+q, cmp2);
for(int i = ; i < q; i++)
printf("%d\n", ans[i].s);
}
return ;
}

HDU5441 Travel (离线操作+并查集)的更多相关文章

  1. HDU5441 Travel 离线并查集

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

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

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

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

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

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

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

  5. HDU 5441 Travel(并查集+统计节点个数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...

  6. poj1733 带权并查集

    题意:有一个 0/1 数列,现在有n组询问和回答,表示某个区间内有奇数或者偶数个1,问到前多少个都没有逻辑错误,而下一个就不满足 可以定奇数为 1 偶数为 0作为每个元素的权值,表示它与它的祖先元素的 ...

  7. hdu 5441 travel 离线+带权并查集

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

  8. hdu 5441 Travel 离线带权并查集

    Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...

  9. Travel(HDU 5441 2015长春区域赛 带权并查集)

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

随机推荐

  1. html 表单初步学习

    <html> <head> <title> 静态页面</title> </head> <body> 这是一个静态页面<br ...

  2. 【LeetCode练习题】Recover Binary Search Tree

    Recover Binary Search Tree Two elements of a binary search tree (BST) are swapped by mistake. Recove ...

  3. linux使用mysql的命令

    1.连接到mysql服务器的命令 mysql -h 服务器主机地址 -u 用户名 -p 用户密码 例:mysql -h 192.168.1.1 -u root -p   //指定服务器的主机地址和用户 ...

  4. Linux优化,history增加详细历史记录

    主要功能: 1, 可以记录哪个ip和时间(精确到秒)以及哪个用户,作了哪些命令 2,最大日志记录增加到4096条   把下面的代码直接粘贴到/etc/profile后面就可以了 #history mo ...

  5. NET基础课--泛型(NET之美)

    1.泛型,类型或方法的一种抽象概括. 2.泛型类:在类型名后面加一个<>,其中传递占位符,也就是类型参数.where是类型约束 可以再查资料 public class SortHelper ...

  6. EasyUI 1.3.1以下的组合验证

    适用于EasyUI 1.3.1以下的, 1.3.2已经自带组合验证(如validType:['validator1','validator2']) $.extend($.fn.validatebox. ...

  7. solr热身

    入博客园快满一年,居然没写一篇博客,好惭愧. 公司的搜索系统需要从Lucene.net(更新相当不给力)换成solr了,最近一直在学习solr,相关资料是相当的少啊,特别是还要在.net环境下开发.准 ...

  8. PHP学习笔记二十八【抽象类】

    <?php //定义一个抽象类.主要用来被继承 //如果一个类继承了抽象类,则它必须实现该抽象类的所有抽象方法(除非它自己也是抽象类) // abstract class Animal{ pub ...

  9. (转) Dynamic memory

      In the programs seen in previous chapters, all memory needs were determined before program executi ...

  10. YUI Array 之dedupe(快速去重)

    YUI.Array.dedupe函数,如果传参为有length属性,返回一个去除掉重复项('1’ 与1 | true 与'true’认为相等)的参数数组副本,如果传参的length为undefined ...