【长郡NOIP2014模拟10.22】道路维护
来源:互联网 发布:shadow socks5 linux 编辑:程序博客网 时间:2024/05/06 08:22
Description
最近徆多人投诉说C国的道路破损程度太大,以至亍无法通行
C国的政府徆重视这件事,但是最近财政有点紧,丌可能将所有的道路都进行维护,所以他们决定按照下述方案进行维护
将C国抽象成一个无向图,定义两个城市乊间的某条路径的破损程度为该条路径上所有边破损程度的最大值,定义两个城市乊间的破损程度为两个城市乊间所有路径破损程度的最小值
然后C国政府向你提问多次,有多少个城市对的破损程度丌超过L,他们将依照你的回答来决定到底怎样维护C国的道路
Input
第一行三个数n,m,q,表示图的点数和边数以及政府的询问数
以下m行每行三个数a,b,c,表示一条连接a,b且破损程度为c的无向边
接下来一行q个数Li,表示询问有多少个城市对的破损程度丌超过Li
Output
一行q个数,对应每个询问,输出满足要求的城市对的数目
Sample Input
4 8 8
1 4 0
3 4 9
4 4 9
1 2 10
3 1 8
1 2 6
4 2 7
1 2 5
4 10 8 1 6 7 7 9
Sample Output
1 6 6 1 3 3 3 6
【友情提示】
一个城市对(i,j),满足
Data Constraint
30%数据满足n≤10^2,m≤10^3,q≤10^2
60%数据满足n≤10^2,m≤10^3,q≤10^5
100%数据满足n≤10^4,m,q≤10^5,0≤c,Li≤10^9
Solution
显然首先得先把图做一遍最小生成树,这样能保证题目中的两点间权值为路径最小值
接着求满足路径最大值大于k的点对有多少个
先将询问排序
从小到大做,每次询问到某条边时,小于这条边权值的边两边的点都已经被合并到一个即合里了,那么这条边两边的点数之积就是这条边的贡献也就是这条边的答案
Code
#include<cstdio>#include<algorithm>#include<cstring>#define N 101000#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;int n,m,q,bz[N],ans[N],fa[N],b[N],size[N];struct node{ int x,y,z;}a[N],c[N];bool cnt(node x,node y){return x.z<y.z;}int gf(int x){ return fa[x]==0?x:fa[x]=gf(fa[x]);}int main(){ scanf("%d%d%d",&n,&m,&q); fo(i,1,m) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z); sort(a+1,a+m+1,cnt); fo(i,1,m) { int x=gf(a[i].x),y=gf(a[i].y); if(x!=y) fa[x]=y,bz[i]=1; } memset(fa,0,sizeof(fa)); fo(i,1,q) scanf("%d",&c[i].z),c[i].x=i; sort(c+1,c+q+1,cnt); int j=1,as=0; a[m+1].z=2147483647; fo(i,1,n) size[i]=1; fo(i,1,q) { for(;a[j].z<=c[i].z;j++) if(bz[j]) { int x=gf(a[j].x),y=gf(a[j].y); if(x!=y) { as+=size[x]*size[y]; fa[x]=y;size[y]+=size[x]; } } ans[c[i].x]=as; } fo(i,1,q) printf("%d ",ans[i]);}
- 道路维护【长郡NOIP2014模拟10.22】
- 【长郡NOIP2014模拟10.22】道路维护
- JZOJ 3886. 【长郡NOIP2014模拟10.22】道路维护
- 【JZOJ3886】【长郡NOIP2014模拟10.22】道路维护
- jzoj3886. 【长郡NOIP2014模拟10.22】道路维护
- 【长郡NOIP2014模拟10.22】字符串查询
- JZOJ3885. 【长郡NOIP2014模拟10.22】搞笑的代码
- 【长郡NOIP2014模拟10.22】搞笑的代码
- 搞笑的代码【长郡NOIP2014模拟10.22】
- {题解}[jzoj3885]【长郡NOIP2014模拟10.22】搞笑的代码
- JZOJ 3885. 【长郡NOIP2014模拟10.22】搞笑的代码
- 【JZOJ3885】【长郡NOIP2014模拟10.22】搞笑的代码
- 【JZOJ3887】【长郡NOIP2014模拟10.22】字符串查询
- 【长郡NOIP2014模拟10.22】搞笑的代码
- JZOJ 3887. 【长郡NOIP2014模拟10.22】字符串查询
- jzoj 3885. 【长郡NOIP2014模拟10.22】搞笑的代码 调和级数
- JZOJ 3808. 【NOIP2014模拟8.25】道路值守
- JZOJ 3808 【NOIP2014模拟8.25】道路值守
- C/C++ 时间 & 日期
- OpenStack之keystone简介
- A+B问题
- C语言/结构体的初始化
- 最小编辑距离
- 【长郡NOIP2014模拟10.22】道路维护
- 每日一个php函数 get_class()
- MyBatis之主键返回
- [牛客网] 从尾到头打印链表
- JavaSE 学习参考:Java数据类型(2)
- 【POJ2976】0-1分数规划
- Android开发---十款 Material Design 风格的 Android 开源项目
- 自旋功能的实现
- 一维码EAN 8简介及其解码实现(zxing-cpp)