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. SimHash算法

    短文本合并重复(去重)的简单有效做法 - 旁观者 - 博客园 短文本合并重复(去重)的简单有效做法 SimHash算法 - ACdreamer - 博客频道 - CSDN.NET SimHash算法

  2. vs2008工程配置

    一.添加H文件目录 依次点击“项目——配置属性——C/C++——常规”, 在“附加包含目录”中加入H文件所在的文件夹.(即项目所要用到的所有.h文件目录都要加进去)   二.添加LIB目录 1)依次点 ...

  3. 打造自己个性的notepad ++

    对coder来说,notepad ++ 是一个很不错的文本编辑器.平时用来看看代码.xml文件,都比系统自带的记事本舒服得多.不过,对于像我这种每天用notepad ++写代码的人,一个原装的note ...

  4. Oracle sga、pga介绍改动

    oracle推荐OLTP(on-line TransactionProcessing)系统oracle占系统总内存的80%,然后再分配80%给SGA,20%给PGA.也就是 SGA=system_to ...

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

    1.类型:值类型  引用类型. 分类依据:类型在内存的分配方式.值类型在堆栈,引用类型在托管堆. 名词:栈--所有变量都会被分配在栈上,只不过值类型直接含有数据,引用类型含有一个指向托管堆对象的地址. ...

  6. ASP.NET导入Excel到SQL数据库

    protected void btnChange_Click(object sender, EventArgs e) { UserInfoClass tClass = (UserInfoClass)S ...

  7. jquery渐隐轮播

    html <body> <div id="banner"> <div id="banner_bg"></div> ...

  8. MongoDB学习笔记02

    MongoDB中使用find来进行查询,查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档.空的查询文档{}会匹配集合的全部内容,要是不指定查 ...

  9. 你所不了解的css选择器

    我们目前接触到的选择器:.class   #id  div  ...... 不了解的选择器:a>b   a+b [a~=b] [a|=b]......   一下说举5 6 7 8为css3中的定 ...

  10. TransactionScrope 2

    继上一篇文章TransactionScrope 在做相应的变动时,发现可以重现ORA-14450错误,如: List<Thread> ls = new List<Thread> ...