HDU - Travel
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 mbidirectional 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.
Note that (a,b) and (b,a) are counted as different pairs and a and b must be different cities.
怎么说呢,哎,在这道题上面浪费了整整一天的时间,理解题意得错误导致了这么严重的后果,简直无语了,下面这张截图,非常励志的一个故事= =

说多了都是泪啊,主要错在了合并城市的路的条数上,我现在的心情你无法理解,呜呜呜呜呜..............
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
using namespace std; #define INF 0x3f3f3f3f
#define lsonl,m,rt<<1
#define rsonm+1,r,rt<<1|1 const int MX = 222222; int road[MX];
int num[MX]; structNode {
int a, b, c;
}node[MX]; structQuery {
int n, sign, ans;
}query[MX]; bool comp1(const Node& n1, const Node& n2) {
return n1.c < n2.c;
} bool comp2(const Query& q1, const Query& q2) {
return q1.n < q2.n;
} bool comp3(const Query& q1, const Query& q2) {
return q1.sign < q2.sign;
} int Find(int x) {
return road[x] == x ? x : (road[x] = Find(road[x]));
} int main() {
//freopen("input.txt", "r", stdin);
int n, m, q;
int cas;
while (scanf("%d", &cas) != EOF) {
while (cas--) {
scanf("%d%d%d", &n, &m, &q);
for (int i = 0; i <= n; i++) {
road[i] = i;
num[i] = 1;
}
for (int i = 1; i <= m; i++) {
scanf("%d%d%d", &node[i].a, &node[i].b, &node[i].c);
}
sort(node + 1, node + m + 1, comp1);
for (int i = 1; i <= q; i++) {
scanf("%d", &query[i].n);
query[i].sign = i;
}
sort(query + 1, query + 1 + q, comp2);
int ans = 0;
for (int i = 1, j = 1; i <= q; i++) {
while (j <= m && node[j].c <= query[i].n) {
int root1 = Find(node[j].a);
int root2 = Find(node[j].b);
j++;
if (root1 != root2) {
ans += num[root1] * num[root2] * 2;//就是这里,好难搞清楚啊,呜呜呜呜............新元素乘以老元素,这就是多出来的新路的条数,乘以二是因为a到d与b到a是两条路
road[root2] = root1;
num[root1] += num[root2];
}
}
query[i].ans = ans;
}
sort(query + 1, query + 1 + q, comp3);
for (int i = 1; i <= q; i++) {
printf("%d\n", query[i].ans);
}
}
}
return 0;
}
HDU - Travel的更多相关文章
- hdu 5441 Travel 离线带权并查集
Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...
- hdu 4885 TIANKENG’s travel(bfs)
题目链接:hdu 4885 TIANKENG's travel 题目大意:给定N,L,表示有N个加油站,每次加满油能够移动距离L,必须走直线,可是能够为斜线.然后给出sx,sy,ex,ey,以及N个加 ...
- hdu 2433 Travel
http://acm.hdu.edu.cn/showproblem.php?pid=2433 题意: 求删除任意一条边后,任意两点对的最短路之和 以每个点为根节点求一个最短路树, 只需要记录哪些边在最 ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- HDU 4418 Time travel 期望dp+dfs+高斯消元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4418 Time travel Time Limit: 2000/1000 MS (Java/Othe ...
- HDU 4418 Time travel
Time travel http://acm.hdu.edu.cn/showproblem.php?pid=4418 分析: 因为走到最后在折返,可以将区间复制一份,就变成了只往右走,01234321 ...
- hdu 5380 Travel with candy(双端队列)
pid=5380">题目链接:hdu 5380 Travel with candy 保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量. ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- 【HDU】4418 Time travel
http://acm.hdu.edu.cn/showproblem.php?pid=4418 题意:一个0-n-1的坐标轴,给出起点X.终点Y,和初始方向D(0表示从左向右.1表示从右向左,-1表示起 ...
随机推荐
- .net学习笔记---webconfig的读与写
System.ConfigurationManager类用于对配置文件的读取.其具有的成员如下: 一.AppSettings AppSetting是最简单的配置节,读写非常简单. 名称 说明 AppS ...
- [LeetCode] Binary Tree Zigzag Level Order Traversal
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- wordpress源码解析-目录结构-文件调用关系(1)
学习开源代码,是一种很快的提升自己的学习方法.Wordpress作为一个开源的博客系统,非常优秀,应用广泛,使用起来简单方便,具有丰富的主题和插件,可以按照自己的需求来任意的进行修改.所以就从word ...
- 第九篇:在SOUI中使用多语言翻译
为UI在不同地区显示不同的语言是产品国际化的一个重要要求. 在SOUI中实现了一套类似QT的多语言翻译机制:布局XML不需要调整,程序代码也不需要调整,只需要为不同地区的用户提供不同的语言翻译文件即可 ...
- Java学习笔记(三)——运算符
一.运算符: 1.分类: 2.java中的运算符 (1)其中,++在左,表示先加了再用,++在右,表示先用了再加. (2)% 用来求余数,也称为"取模运算符" 3.赋值运算符 4. ...
- js获取今天明天
目的:记录中展现"今天","明天",除外展现月日. 借鉴: <html> <head> <meta http-equiv=&quo ...
- 指针数组 vs 数组指针
指针数组,故名思义,就是指针的数组,数组的元素是指针: 数组指针,同样,就是直想数组的指针. 简单举例说明: int *p[2]; 首先声明了一个数组,数组的元素是in ...
- JavaScript内置对象(字符串,数组,日期的处理)
Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义一个时间对象 : var Udate=new Date(); 注意:使用关键字new,Date()的首 ...
- super一些要点
package o6; class Grandparent { public Grandparent() { System.out.println("GrandParent Created. ...
- daemontools管理fast-fail的zookeeper
daemontools项目:http://cr.yp.to/daemontools.html 1.安装daemontools mkdir /package /package cd /package w ...