HDU---5441-Travel(并查集)(2015 Changchun)
2015-09-17 20:36
369 查看
Travel
Problem DescriptionJack likes to travel around the world, but he doesn’t like to wait. Now, he is traveling in the Undirected Kingdom. There aren cities
and mbidirectional
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 integerT,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 ncities
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
#include <iostream> #include <cstring> #include <vector> #include <queue> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define cin1(x) scanf("%d",&x) #define cin2(x,y) scanf("%d%d",&x,&y) #define cin3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define ccout(x) printf("%d\n",x) int n,m,q,T,sum_val; int set[20005],sum_set[20005]; struct Road { int a,b,val; Road(int x,int y,int z):a(x),b(y),val(z) {} friend bool operator<(Road x,Road y) { return x.val<y.val; } }; struct Question { int num,poi; friend bool operator<(Question x, Question y) { return x.poi<y.poi; } } que[6005]; int ans[6005]; int set_find(int x) { if(set[x]==-1)return x; return set[x]=set_find(set[x]); } void set_friend(int x,int y) { x=set_find(x); y=set_find(y); if(x!=y) { set[x]=y; sum_val-=sum_set[x]*(sum_set[x]-1)+sum_set[y]*(sum_set[y]-1); sum_set[y]+=sum_set[x]; sum_set[x]=0; sum_val+=sum_set[y]*(sum_set[y]-1); } } vector<Road> all_road; void mem_val() { all_road.clear(); for(int i=0; i<=n; ++i) { set[i]=-1; sum_set[i]=1; } memset(ans,0,sizeof(ans)); } int main() { cin1(T); int i,j,k,l,x,y,z; while(T--) { cin3(n,m,q); mem_val(); for(i=0; i<m; ++i) { cin3(x,y,z); all_road.push_back(Road(x,y,z)); } for(i=0; i<q; ++i) { cin1(x); que[i].poi=x; que[i].num=i; } sort(all_road.begin(),all_road.end()); sort(que,que+q); int nowi=0; sum_val=0; for(i=0; i<q; ++i) { while(nowi<m && all_road[nowi].val<=que[i].poi) { set_friend(all_road[nowi].a,all_road[nowi].b); nowi++; } ans[ que[i].num ]=sum_val; } for(i=0; i<q; ++i) { ccout(ans[i]); } } return 0; }
相关文章推荐
- HDU 2102 A计划
- 0917Android基础自定义View(Path)
- swift 日历练习
- ios9键盘回调与消息通知,理论上应该是个bug
- 大话移动app测试_阅读
- 以树形结构的形式输出指定目录下面的所有文件
- 优秀IT技术文章集(最新)(高质量)
- CGS flip 学习总结
- bash shell基础之一
- android学习:service 绑定,与服务进行通信
- EPEL&&Yum Priorities
- git 文件删除与恢复
- XML文件在TwinCAT里面的作用
- 找出一组数据中多次出现的所有数字(空间要求最低)
- 浅谈数据结构-归并排序
- test4.1
- VS2013 快捷键乱掉如何修改回来
- 移动王国的诱惑【经济学人】
- VS2013 快捷键乱掉如何修改回来
- 防盗链的开发