Travel

Travel

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

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

思路:并查集;

我们用离线查询,然后将边按照升序排列,询问按照升序排列,然后我们可以用并查集维护联通的点,也就是本来不在同一个集合中的点只要有小于d的边就把他两合并,那么小于

d长度的点的组合,就是所有合法的集合求Cn2*2;

由于后面的d是比前面的大的所以前面我们所求得对后面的是有贡献的,我们就不需要从新循环找了

  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<stdlib.h>
  5 #include<math.h>
  6 using namespace std;
  7 typedef long long LL;
  8 int bin[30000];
  9 LL du[30000];
 10 typedef struct pp
 11 {
 12     int x;
 13     int y;
 14     int cost;
 15 } ss;
 16 typedef struct ak
 17 {
 18     int x;
 19     int id;
 20 } dd;
 21 ss aa[200005];
 22 dd kk[6000];
 23 LL an[6000];
 24 bool cmp(pp p,pp q)
 25 {
 26     return p.cost<q.cost;
 27 }
 28 bool cmp1(dd p,dd q)
 29 {
 30     return p.x<q.x;
 31 }
 32 int main(void)
 33 {
 34     int i,j,k;
 35     int n,m;
 36     int ask;
 37     scanf("%d",&k);
 38     while(k--)
 39     {
 40         scanf("%d %d",&n,&m);
 41         scanf("%d",&ask);
 42         for(i=0; i<m; i++)
 43         {
 44             scanf("%d %d %d",&aa[i].x,&aa[i].y,&aa[i].cost);
 45         }
 46         for(i=0; i<ask; i++)
 47         {
 48             scanf("%d",&kk[i].x);
 49             kk[i].id=i;
 50         }
 51         aa[m].cost=1e9;
 52         sort(aa,aa+m,cmp);
 53         sort(kk,kk+ask,cmp1);
 54         for(i=0; i<=20000; i++)
 55         {
 56             du[i]=1;
 57             bin[i]=i;
 58         }
 59         LL cnt=0;
 60         int t=0;
 61         for(i=0; i<=m; i++)
 62         {
 63             int x=aa[i].x;
 64             int y=aa[i].y;
 65             while(aa[i].cost>kk[t].x&&t<ask)
 66             {
 67                 an[kk[t].id]=cnt;
 68                 t++;
 69             }
 70             if(t==ask)
 71                 break;
 72             int xx,yy;
 73             for(xx=x; xx!=bin[xx];)
 74             {
 75                 xx=bin[xx];
 76             }
 77             for(yy=y; yy!=bin[yy];)
 78             {
 79                 yy=bin[yy];
 80             }
 81             if(xx!=yy)
 82             {
 83                 cnt=cnt-(LL)du[xx]*(LL)(du[xx]-1)/2;
 84                 cnt=cnt-(LL)du[yy]*(LL)(du[yy]-1)/2;
 85                 if(du[xx]>du[yy])
 86                 {
 87                     du[xx]+=du[yy];
 88                     bin[yy]=xx;
 89                     cnt+=(LL)du[xx]*(LL)(du[xx]-1)/2;
 90                 }
 91                 else
 92                 {
 93                     du[yy]+=du[xx];
 94                     bin[xx]=yy;
 95                     cnt+=(LL)du[yy]*(LL)(du[yy]-1)/2;
 96                 }
 97             }
 98         }
 99         for(i=0; i<ask; i++)
100         {
101             printf("%lld\n",an[i]*2);
102         }
103     }
104     return 0;
105 }
时间: 2024-09-29 04:30:08

Travel的相关文章

UVA 1048 - Low Cost Air Travel(最短路)

UVA 1048 - Low Cost Air Travel 题目链接 题意:给定一些联票,在给定一些行程,要求这些行程的最小代价 思路:最短路,一张联票对应几个城市就拆成多少条边,结点表示的是当前完成形成i,在城市j的状态,这样去进行最短路,注意这题有坑点,就是城市编号可能很大,所以进行各种hash 代码: #include <cstdio> #include <cstring> #include <vector> #include <queue> #in

Travel(最短路)

Travel The country frog lives in has nn towns which are conveniently numbered by 1,2,…,n1,2,…,n. Among n(n−1)2n(n−1)2 pairs of towns, mm of them are connected by bidirectional highway, which needs aa minutes to travel. The other pairs are connected b

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

Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2404    Accepted Submission(s): 842 Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, he is tr

ural 1286. Starship Travel

1286. Starship Travel Time limit: 1.0 secondMemory limit: 64 MB It is well known that a starship equipped with class B hyperengine is able to travel from any planet to any other planet. But your starship got severe damage in the last travel and now i

hdu 4571 Travel in time (Floyd+记忆化搜索)

Travel in time Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1853    Accepted Submission(s): 374 Problem Description Bob gets tired of playing games, leaves Alice, and travels to Changsha alo

travel hamburg

The area west of Hamburg's central railway station is mainly a shopping area with the streets Spitaler Straße and Mönckebergstraße, leading to Hamburg's town hall. The building behind the city hall is Hamburg's House of Commerce (Börse). Between the

poj 3230 Travel(dp)

Description One traveler travels among cities. He has to pay for this while he can get some incomes. Now there are n cities, and the traveler has m days for traveling. Everyday he may go to another city or stay there and pay some money. When he come

hdu5431 Travel

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

pat1030. Travel Plan (30)

1030. Travel Plan (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A traveler's map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help

PAT 1030. Travel Plan (30)

1030. Travel Plan (30) A traveler's map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting cit