几种版本的题面

Description

You are given an undirected graph G with N vertices and M edges. Each edge has a length. Below are two definitions.

  1. Define max_len(p) as the length of the edge with the maximum length of p where p is an arbitrary non-empty path in G.
  2. Define min_pair(uv) as min{max_len(p) | p is a path connecting the vertices u and v.}. If there is no paths connecting u and vmin_pair(uv) is defined as infinity.

Your task is to count the number of (unordered) pairs of vertices u and v satisfying the condition that min_pair(uv) is not greater than a given integer A.

Input

The first line of input contains three integer NM and Q (1 < N ≤ 10,000, 0 < M ≤ 50,000, 0 < Q ≤ 10,000). N is the number of vertices, M is the number of edges and Q is the number of queries. Each of the next M lines contains three integers ab, and c (1 ≤ ab ≤ N, 0 ≤ c < 108) describing an edge connecting the vertices a and b with length c. Each of the following Q lines gives a query consisting of a single integer A (0 ≤ A < 108).

Output

Output the answer to each query on a separate line.

Sample Input

4 5 4
1 2 1
2 3 2
2 3 5
3 4 3
4 1 4
0
1
3
2

Sample Output

0
1
6
3

Source

描述

A国有n座城市,每座城市都十分美,这使得A国的民众们非常喜欢旅行。然而,A国的交通十分落后,这里只有m条双向的道路,并且这些道路都十分崎岖,有的甚至还是山路,只能靠步行。通过每条道路的长度、泥泞程度等因素,我们给每条道路评估一个“崎岖度”,表示通过这条道路的不舒适程度。
从X城市经过若干条道路到达Y城市,我们称这次旅行的“代价”为所经过道路“崎岖度”的最大值。当然,如果从X城市到Y城市有多条路线,民众们会自觉选择“代价”最小的路线进行旅行。但是,A国的民众也是有脾气的,如果旅行的“代价”超过了他们的“忍耐度”,他们就不选择这个旅行了,甚至宁愿在家里宅着。
现在A国的国王想进行若干次询问:给定民众的“忍耐度”,问还有多少对城市(X,Y)会存在旅行?请你对国王的每次询问分别给出回答。

输入格式

第1行三个正整数n、m、Q,分别表示城市数量、道路数量和询问次数。
第2行到第m+1行每行三个正整数x、y、w,表示x号城市和y号城市之间有一条“崎岖度”为w的双向道路。
第m+2行至第m+Q+1行,每行一个正整数k,表示询问中给定的“忍耐度”为k。

输出格式

共Q行,对于每次询问做出回答。

测试样例1

输入

5 5 2 
1 2 1 
2 3 2 
3 4 1 
4 5 4 
5 1 1 

2

输出


10

备注

【样例说明】
第一个询问:(1,2)、(1,5)、(2,5)、(3,4)。其中(2,5)的具体走法为:2-1-5
第二个询问:(1,2)、(1,3)、(1,4)、(1,5)、(2,3)、(2,4)、(2,5)、(3,4)、(3,5)、(4,5)。其中(4,5)的具体走法为:4-3-2-1-5
【数据规模】
对于20%的数据满足n<=20,m<=40,Q<=40;
对于40%的数据满足n<=1000,m<=2000,Q<=1000;
对于60%的数据满足n<=3000,m<=6000,Q<=200000;
对于100%的数据满足n<=100000,m<=200000,Q<=200000。其他数不超过10^9。
【细节提示】
1 给出的n个城市不一定全部互相连通,且两个城市之间可能存在多条道路,也可能存在某条边是从某城市出发回到他自己。
2 对于询问的结果可能很大,请注意使用适当的类型存储。

询问
问题描述
背景:
在一个美丽的国度里,有n座城市,在每个城市中都住着一个球老板,这些球老板们非常喜
欢互相串门。。。现在YPZ的侄子XPZ的突然对这个妙不可言的国度产生了兴趣,他对你
提出了Q个问题,希望得到你的回答。。。

题目描述:
现在有一个n个点m条边的无向图,每条边有一个”崎岖度”。从X城市经过若干条道路到达Y
城市,我们称这次旅行的“代价”为所经过道路“崎岖度”的最大值。当然,如果从X城市到Y城
市有多条路线,球老板们会自觉选择“代价”最小的路线进行串门。如果旅行的“代价”超过了
他们的“忍耐度”,他们就不选择这次串门了,甚至宁愿在家里宅着。
现在XPZ想进行Q次询问:给定球老板们的“忍耐度”,问还有多少对城市(X,Y)会存在串门?
请你对XPZ的每次询问分别给出回答。
输入格式
1行三个正整数n、m、Q,分别表示城市数量、道路数量和询问次数。
第2行到第m+1行每行三个正整数x、y、w,表示x号城市和y号城市之间有一条“崎岖度”为w
的双向道路。
第m+2行至第m+Q+1行,每行一个正整数k,表示询问中给定的“忍耐度”为k。
输出格式
共Q行,对于每次询问做出回答。
样例输入输出
样例输入1
5 5 2
1 2 1
2 3 2
3 4 1
4 5 4
5 1 1
1
2
样例输出1
4
10
限制与约定对于20%的数据满足n<=20,m<=40,Q<=40;
对于50%的数据满足n<=3000,m<=6000,Q<=200000;
对于100%的数据满足n<=100000,m<=200000,Q<=200000。其他数不超过10^9。
提示:
1 给出的n个城市不一定全部互相连通,且两个城市之间可能存在多条道路,也可能存在某
条边是从某城市出发回到他自己。
2 对于询问的结果可能很大,请注意使用适当的类型存储。

思路:离线,先读入询问,然后按顺序加边,对于每个询问统计一下即可。。。考试居然没做出来,中午20min切了。。。

 // It is made by XZZ
#include<cstdio>
#include<algorithm>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=;rg char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x;
}
const int maxn=,maxm=;
struct edge{int a,b,c;}E[maxm];
bool operator < (edge a,edge b){return a.c<b.c;}
int fa[maxn];ll siz[maxn],ans;
struct qq{int q,id;ll ans;}Q[];
il bool cmpq1(qq a,qq b){return a.q<b.q;}
il bool cmpq2(qq a,qq b){return a.id<b.id;}
il int hd(int a){
if(a==fa[a])return a;
else return fa[a]=hd(fa[a]);
}
il vd Union(int a,int b){
rg int A=hd(a),B=hd(b);
if(A^B)ans+=siz[A]*siz[B],siz[A]+=siz[B],fa[B]=A;
}
int main(){
rg int n=gi(),m=gi(),q=gi();
rep(i,,m)E[i].a=gi(),E[i].b=gi(),E[i].c=gi();
sort(E+,E+m+);
rep(i,,n)fa[i]=i,siz[i]=;
rep(i,,q)Q[i]=(qq){gi(),i};
sort(Q+,Q+q+,cmpq1);
rg int NOW=;
rep(i,,q){
while(E[NOW].c<=Q[i].q)Union(E[NOW].a,E[NOW].b),++NOW;
Q[i].ans=ans;
}
sort(Q+,Q+q+,cmpq2);
rep(i,,q)printf("%lld\n",Q[i].ans);
return ;
}

最新文章

  1. sFlow-RT
  2. [terry笔记]IMPDP报错ORA-39083 Object type TYPE failed to create ORA-02304
  3. 死亡之ping(Ping of Death)
  4. 为MYPoint类写一个分类
  5. Regular Expressions in Grep Command with 10 Examples --reference
  6. SharePoint DataFormWebPart 通过Caml和xslt聚合内容
  7. 2014-08-13 SQL语句之Left Join
  8. sublime text 发现一个超好的编辑器
  9. 出现No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here异常
  10. 什么是Java “实例化”
  11. Nagios监控生产环境redis群集服务战
  12. Android面试题目总结
  13. django(权限、认证)系统——第三方组件实现Object级别权限控制
  14. angular6、7 兼容ie9、10、11
  15. drop all database objects
  16. LInux下设置账号有效时间 以及 修改用户名(同时修改用户组名和家目录)
  17. Personal Software Process (PSP)
  18. 使用 wondershaper 在 Linux 中限制网络带宽使用
  19. static关键字的使用(有个深刻领悟)
  20. Python Django框架笔记(二):创建应用和django 管理

热门文章

  1. 文件夹名为单字符时右击弹出C++错误
  2. CMake: Could NOT find PkgConfig
  3. python第三方库——xlrd和xlwt操作Excel文件学习
  4. 使用Oracle的instr函数与索引配合提高模糊查询的效率
  5. Css中路径data用法
  6. ubuntu修改用户环境变量解决音乐播放器Rhythmbox乱码问题
  7. 用pymysql代替MySQLdb
  8. Android学习路线总结,绝对干货(转)
  9. [luogu2668] 斗地主
  10. Docker实战(六)之使用Dockerfile创建镜像