hdu 5441 并查集

Travel

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

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

Source

2015 ACM/ICPC Asia Regional Changchun Online

其实这道题 队里之前讲过的 一直没有写...gg

一直TLE 然后学习了离线并查集 先排序 一边扫 一边存  还有计算几对的姿势也不好  he+=mp[ss]*mp[ee]

然后 然后 按着这个敲了还是超时 gg  太菜比了  并查集 以为了解的很深了

如下正解

int Find(int mubiao)
{
    if(parent[mubiao]!=mubiao)
        parent[mubiao]=Find(parent[mubiao]);//原来的姿势一直有bug
    return parent[mubiao];
}

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t;
int n,m,q;
struct  path
{
    int s;
    int e;
    int dis;
     bool operator <(const path &x)const{
      return dis<x.dis;
     }
}P[100005];
struct limi
{
    int id;
    int limit;
    bool operator <(const limi &x)const{
      return limit<x.limit;
     }
}L[100005];
__int64 re[5005];
int parent[20005];
int mp[20005];
int Find(int mubiao)
{
    if(parent[mubiao]!=mubiao)
        parent[mubiao]=Find(parent[mubiao]);
    return parent[mubiao];
}
void init()
{
    for(int j=1;j<=n;j++)
    {
        parent[j]=j;
        mp[j]=1;
    }
    memset(re,0,sizeof(re));
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&q);
        for(int i=0;i<m;i++)
            scanf("%d%d%d",&P[i].s,&P[i].e,&P[i].dis);
        sort(P,P+m);
        for(int i=0;i<q;i++)
        {
            L[i].id=i;
            scanf("%d",&L[i].limit);
        }
        sort(L,L+q);
        init();
        int gg=0;
        __int64 he=0;
        for(int i=0;i<q;i++)
        {
            while(gg<m&&L[i].limit>=P[gg].dis)
            {
                int ss=Find(P[gg].s);
                int ee=Find(P[gg].e);
                if(ss!=ee)
                {
                    he+=mp[ss]*mp[ee];
                    parent[ee]=ss;
                    mp[ss]+=mp[ee];
                }
                gg++;
            }
            re[L[i].id]=he;
        }
        for(int i=0;i<q;i++)
            printf("%I64d\n",2*re[i]);
}
return 0;
}
时间: 2024-10-26 23:07:59

hdu 5441 并查集的相关文章

HDU 1051 并查集+贪心

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11694    Accepted Submission(s): 4837 Problem Description There is a pile of n wooden sticks. The length and weight of each stick ar

HDU 1512 并查集+左偏树

Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3105    Accepted Submission(s): 1330 Problem Description Once in a forest, there lived N aggressive monkeys. At the beginning, they e

hdu 1829 并查集(食物链的弱化版)

http://acm.hdu.edu.cn/showproblem.php?pid=1829 Problem Description Background  Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of

hdu 4514 并查集+树形dp

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 4539    Accepted Submission(s): 816 Problem Description 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,

hdu 1856 并查集

http://acm.hdu.edu.cn/showproblem.php?pid=1856 More is better Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others)Total Submission(s): 13672    Accepted Submission(s): 5008 Problem Description Mr Wang wants some boys

HDU 1181 并查集 or SPFA

变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 12773    Accepted Submission(s): 4733 Problem Description 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规

hdu 1213 并查集入门

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12538    Accepted Submission(s): 6145 Problem Description Today is Ignatius' b

HDU 3938 并查集

求小于L的路径点对数(路上的最大值),按权值排序,从小到大并查集建图,有点kruskal的意思. /** @Date : 2017-09-22 17:30:11 * @FileName: HDU 3938 并查集 离线.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h>

HDU 1829 并查集

A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8224    Accepted Submission(s): 2631 Problem Description Background Professor Hopper is researching the sexual behavior of a rare sp