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

Travel

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

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 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.

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

2015 ACM/ICPC Asia Regional Changchun Online

题目大意:无向图。给你m条边,u - v 每条边有一个权值w。表示从城市u - v、v - u 的时间是w。然后q次询问。每次询问一个x值。表示问你当时间容忍为x时,可以走多少个城市对。每次到一个城市后可以休息,时间容忍会重新变为x。

解题思路:首先按边权把边排序。用并查集统计加入第k条边时可以走的城市对个数,记录在pair_cnt数组中。同时需要维护每个集合中的点的个数。最后在排完序后的边中二分找到第一个大于x的边的编号ck。然后在pair_cnt数组中找到编号ck-1即为答案。

#include<bits/stdc++.h>
using namespace std;
const int maxn=(1e4)*3;
const int maxm=1e5+200;
const int INF=0x3f3f3f3f;
struct Edge{
    int u,v,w;
    Edge(){}
    Edge(int _u,int _v,int _w){
        u=_u; v=_v; w=_w;
    }
}edges[maxm];
int cnt[maxn],pair_cnt[maxm];
int fa[maxn];
void init(int n){
    for(int i=0;i<=n;i++){
        fa[i]=i;
        cnt[i]=1;
    }
}
int Find(int x){
    if(fa[x]!=x){
        return fa[x]=Find(fa[x]);
    }
    return x;
}
int Union(int u,int v){
    int fu=Find(u);
    int fv=Find(v);
    int ret;
    if(fu<fv){
        ret=cnt[fu]*cnt[fv]*2;
        fa[fv]=fu;
        cnt[fu]+=cnt[fv];
        return ret;
    }else if(fu>fv){
        ret=cnt[fu]*cnt[fv]*2;
        fa[fu]=fv;
        cnt[fv]+=cnt[fu];
        return ret;
    }else{
        return 0;
    }
}
bool cmp(Edge a,Edge b){
    return a.w<b.w;
}
int BinSearch(int l,int r,int key){
    while(l<r){
        int md=(l+r)/2;
        if(key<edges[md].w){
            r=md;
        }else if(key>edges[md].w){
            l=md+1;
        }else{
            return md+1;
        }
    }
    return r;
}
int main(){
    int t,n,m,q;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&n,&m,&q);
        init(n);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w);
        }
        sort(edges+1,edges+1+m,cmp);
        edges[0].w=-1;edges[m+1].w=INF;
        for(int i=1;i<=m;i++){
            pair_cnt[i]=pair_cnt[i-1]+Union(edges[i].u,edges[i].v);
        }
        int tmp;
        for(int i=0;i<q;i++){
            scanf("%d",&tmp);
            printf("%d\n",pair_cnt[BinSearch(0,m+1,tmp)-1]);
        }
    }
    return 0;
}

  

时间: 2024-10-24 21:29:05

HDU 5441——Travel——————【并查集+二分查界限】的相关文章

hdu 5441 Travel 离线带权并查集

Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 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

hdu 5441 travel 离线+带权并查集

Time Limit: 1500/1000 MS (Java/Others)  Memory Limit: 131072/131072 K (Java/Others) 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 bidir

HDU 5441 Travel 并查集

HDU 5441 Travel 题意:一张无向图,q个查询,对于每个x,有多少对点之间的路径中最长的一条路不大于x. 思路:比赛时王秋平写的,我补下题.这题也比较简单,将边排序,从小到大加到并查集,对查询也排序,从小到大对于每个查询把不大于x的边加到并查集,用cnt[y]记录以y为根的连通块有多少节点,那么在连通块发生 变化时,ans=2 * cnt[x] * cnt[y] 1 #include <iostream> 2 #include <cstdio> 3 #include &

《数据结构与算法分析:C语言描述》复习——第八章“并查集”——并查集

2014.06.18 14:16 简介: “并查集”,英文名为“union-find set”,从名字就能看出来它支持合并与查找功能.另外还有一个名字叫“disjoint set”,中文名叫不相交集合.可能我们倾向于用最短的名字,所以就出现了“并查集”翻译为“disjoint set”的情况.并查集是一种树形结构,但与之前讲的树不同的是,这里的树节点只记录父节点,因此是一对一的,就可以用数组来表示并查集. 图示: 并查集可以认为是一个“森林”,也就是多棵树: 既然是并查集,先看看合并3和5之后结

Hdu 5441 Travel(并查集)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5441 思路:离线处理.将边权值按从小到大排序,查询标号后按照从小到大排序.对于每次查询,依次将比当前查询值小的边加入并查集.对于两个符合条件即将合并的连通块增加答案个数num[x]*num[y]*2 .合并:fa[x]=y; num[y]+=num[x]; .最后依次输出结果即可. #include<cstdio> #include<cstring> #include<iostr

hdu 5441 Travel 离线操作+并查集

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一张图,有n个点,m条带权边,每次询问给出一个值val,要求删除权值>val的所有边.然后每次询问求多少个点对相连,ab和ba算成两个点对. 思路: 把每条边的权值按照从小到大排序,把每个询问记录下来,按照从小到大排序. 初始图没有边.然后按照询问加入边.对于每个询问,除了已经加入的边,再加入权值比它小的边. 然后用并查集求得每次加一条边后新产生的点对. 用一个数组cnt[i],来记

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

http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点对(x,y)使得在x到y的路径上没有一条边的距离大于d. 思路:只要边距离小于d,那就是可行的,直接加入并查集来维护.并查集需要维护一下树的节点个数. 将边和询问都排序离线处理. 1 #include<iostream> 2 #include<cstdio> 3 #include<

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

题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u到城市w的长度e1≤d,同时城市w到城市v的长度e2≤d). 析:一开始的时候,题意都读错了,怎么看都不对,原来是只要最大的d小于等于x就可以,过了好几天才知道是这样..... 这个题是并查集的应用,先从d小的开始遍历,然后去判断有几个连通块,在连通块中计数,用一个数组即可,运用排列组合的知识可以知

hdu 3277 Marriage Match III【最大流+并查集+二分枚举】

Marriage Match III Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1491    Accepted Submission(s): 440 Problem Description Presumably, you all have known the question of stable marriage match.