2015区域赛长春网络赛 Travel
2015-09-16 21:10
465 查看
Travel
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1528 Accepted Submission(s): 541
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
比赛的时候没有看出来是并查集,结果没有做出来。。。
用并查集做:
先对边进行排序储存,从小到大;再对询问从小到大进行排序储存。
然后每次一个询问,进行边的合并和联通分量的合并,计算出每次合并增加的点对数。。。其实就是
c(n1+n2)-(c(n1,2)+c(n2,2))*2=n1*n2*2;
代码如下:
#include<iostream> #include<fstream> #include<set> #include<stack> #include<cmath> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int MAX=0xfffffff; const int mx=22000; struct Node{ int id; int value; int num; bool operator<(const Node&a)const{ return value<a.value; } }node[mx]; struct Edge{ int u,v,w; bool operator<(const Edge &a)const{ return w<a.w; } }edge[mx*5]; int fa[mx],num[mx]; int _find(int x) { return fa[x]==x?x:fa[x]=_find(fa[x]); } void _union(int x,int y) { x=_find(x),y=_find(y); if(y<x) swap(x,y); fa[y]=x; num[x]+=num[y]; } bool cmp2(Node a,Node b) { return a.id<b.id; } int main() { //freopen("in.txt","r",stdin); int t; scanf("%d",&t); while(t--) { int n,m,q; scanf("%d %d %d",&n,&m,&q); for(int i=1;i<=n;i++) fa[i]=i,num[i]=1; for(int i=0;i<m;i++) { scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].w); } sort(edge,edge+m); for(int i=0;i<q;i++) { scanf("%d",&node[i].value); node[i].id=i; node[i].num=0; } sort(node,node+q); int j=0; int ans=0; for(int i=0;i<q;i++) { while(j<m&&edge[j].w<=node[i].value) { int u=_find(edge[j].u); int v=_find(edge[j].v); j++; if(u==v) continue; ans+=2*num[u]*num[v]; _union(u,v); } node[i].num=ans; } sort(node,node+q,cmp2); for(int i=0;i<q;i++) printf("%d\n",node[i].num); } return 0; }
相关文章推荐
- NetworkRequest 网络请求
- VB6.0 GetTcpTable 使用详解
- 计算机网络学习 :互联网与万维网的区别
- android解析JSON,XML数据的请求网络工具类
- flex通过HTTPService与java通信例子
- TCP控制拥塞的四种算法:慢开始,拥塞避免,快重传,快恢复
- windows中VMware Workstation环境下的Linux网络设置Bridge方法设置
- TCP 的那些事儿(下)
- 2015区域赛长春网络赛 Elven Postman
- TCP 的那些事儿(上)
- 3.5 fdopen()和fileno()函数 http://book.2cto.com/201212/11763.html
- 网络七层架构
- 网络七层架构
- dup和dup2函数 http://www.cnblogs.com/svking/archive/2012/08/10/dup.html
- 转 Wireshark和TcpDump抓包分析心得
- 转载:Chrome 中的 JavaScript 断点设置和调试技巧 http://han.guokai.blog.163.com/blog/static/136718271201321402514114/
- 比较好的方式管理我们的应用判断,比如Activity跳转,网络是否连接,判断json....
- Android监听网络状态
- tcp加速技术
- Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)