HDU-5441 Travel 離線-並查集
阿新 • • 發佈:2018-08-07
names total mathjax cit not com scrip std php minutes, how many pairs of city (a,b) are there that Jack can travel from city a to b without going berserk?
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.
Travel
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 4680 Accepted Submission(s): 1532
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
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
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
Recommend hujie | We have carefully selected several similar problems for you: 6361 6360 6359 6358 6357 題意:t組數據,每次n個點,m條邊,q次詢問,每次給出一個值,求用到所有邊權不大於這個值的邊的情況下,能夠互相到達的點對的個數 思路:離線並查集,按權值排序即可
#include<bits/stdc++.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn = 20005; int pre[maxn],r[maxn]; ll ans[maxn]; struct node { int u,v; ll val; bool friend operator < (const node xx,const node yy) { return xx.val<yy.val; } } e[maxn*10]; struct pp { ll dis; int id; bool friend operator < (const pp xx,const pp yy) { return xx.dis<yy.dis; } } Q[5005]; void init(int n) { for(int i=1; i<=n; i++) {pre[i]=i;r[i]=1;} } int Find(int x) { return x==pre[x]?x:pre[x]=Find(pre[x]); } 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 %lld",&e[i].u,&e[i].v,&e[i].val); } sort(e+1,e+1+m); for(int i=1; i<=q; i++) { scanf("%lld",&Q[i].dis); Q[i].id=i; } sort(Q+1,Q+1+q); int j=1,cnt=0; for(int i=1; i<=q; i++) { while(j<=m&&Q[i].dis>=e[j].val) { int u=Find(e[j].u); int v=Find(e[j].v); if(u!=v) { cnt+=r[u]*r[v]; pre[u]=v; r[v]+=r[u]; } j++; } ans[Q[i].id]=cnt<<1; } for(int i=1;i<=q;i++) printf("%lld\n",ans[i]); } }View Code
PS:摸魚怪的博客分享,歡迎感謝各路大牛的指點~
HDU-5441 Travel 離線-並查集