Avito Cool Challenge 2018:D. Maximum Distance
D. Maximum Distance
题目链接:https://codeforces.com/contest/1081/problem/D
题意:
给出一个连通图以及一些特殊点,现在定义cost(u,v)为一条从u到v的路径上面边权的最大值,然后定义dis(u,v)为从u到v所有路径上面cost的最小值。
最后求所有特殊点到其它特殊点的最大距离...
题解:
这个题意似乎有点绕...
我们考虑一下最小生成树,那么点与点之间的距离就为最小生成树路径上面边权的最大值。
我们来证明一下:假设在最小生成树上面的路径cost为w1,另外在原图中还有一条路径从u到v,其cost为w2,那么必然有w2>w1的。那么我们最后的dis一定是w1。
那么我们现在的目标就是求特殊点到特殊点之间的最大距离。注意一下这里是从一个特殊点到其它所有特殊点的最大距离。
我们知道在Kruskal加边时,后加的边权一定时大于前面的边权的,既然要求最大权值,那么我们可以想加的最后一条边是否可以作为答案。
我们假设现在有两个集合,现在将其连接起来,当满足两个集合里面都有特殊点时我们就可以更新答案了,否则就不行。
所以我们合并的时候顺带维护一下集合里面特殊点的信息就可以了。
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e5+;
struct Edge{
int u,v,w;
bool operator < (const Edge&A)const{
return w<A.w;
}
}e[N];
int n,m,k;
int a[N],f[N],val[N];
int find(int x){
if(x==f[x]) return f[x];
f[x]=find(f[x]);
return f[x];
}
int main(){
cin>>n>>m>>k;
int tot=k;
for(int i=,t;i<=k;i++){
cin>>t;
a[t]=;
}
for(int i=;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
e[i]=Edge{u,v,w};
}
for(int i=;i<=n;i++) f[i]=i;
sort(e+,e+m+);
int ans;
for(int i=;i<=m;i++){
int u=e[i].u,v=e[i].v,w=e[i].w;
int fx=find(u),fy=find(v);
if(fx==fy) continue;
f[fx]=fy;
if(a[u]) val[fx]++;if(a[v]) val[fy]++;
if(val[fx]&&val[fy]) ans=w;
val[fy]+=val[fx];
}
for(int i=;i<=k;i++) cout<<ans<<" ";
return ;
}
Avito Cool Challenge 2018:D. Maximum Distance的更多相关文章
- Avito Cool Challenge 2018:D. Maximum Distance (最小生成树)
题目链接 题意 : 给出一个联通图和一些特殊的点,现在定义cost(u,v)为一条从u到v的路径上面边权的最大值 , 定义dis(u,v) 为从u到v 路径上面cost 的最小值 然后求所有特殊点到其 ...
- Avito Cool Challenge 2018:C. Colorful Bricks
C. Colorful Bricks 题目链接:https://codeforces.com/contest/1081/problem/C 题意: 有n个横向方块,一共有m种颜色,然后有k个方块的颜色 ...
- Codeforces Avito Code Challenge 2018 D. Bookshelves
Codeforces Avito Code Challenge 2018 D. Bookshelves 题目连接: http://codeforces.com/contest/981/problem/ ...
- Avito Cool Challenge 2018(div1+2)
A. Definite Game: 题意:输入N,输出最小的结果N-x,其中x不少N的因子. 思路:N=2时,输出2:其他情况输出1:因为N>2时,N-1不会是N的因子. #include< ...
- Avito Cool Challenge 2018 Solution
A. Definite Game 签. #include <bits/stdc++.h> using namespace std; int main() { int a; while (s ...
- Avito Cool Challenge 2018
考挂了.. A - Definite Game 直接看代码吧. #include<cstdio> #include<cstring> #include<algorithm ...
- Avito Code Challenge 2018
第一次打CF,很菜,A了三道水题,第四题好像是是数位DP,直接放弃了.rateing从初始的1500变成了1499,还是绿名,这就很尴尬.之后觉得后面的题目也没有想象的那么难(看通过人数)过两天吧剩下 ...
- Avito Cool Challenge 2018 自闭记
A:n==2?2:1. #include<iostream> #include<cstdio> #include<cmath> #include<cstdli ...
- Avito Cool Challenge 2018 E. Missing Numbers 【枚举】
传送门:http://codeforces.com/contest/1081/problem/E E. Missing Numbers time limit per test 2 seconds me ...
随机推荐
- php异步执行函数
1.在unix系统中,使用popen和pclose可以创建管道(通信途径)来连接到其他程序. 2.能够执行服务器命令的php函数有: exec(commond,$output) 接收一个命令,把得 ...
- jquery获取元素在文档中的位置信息以及滚动条位置(转)
jquery获取元素在文档中的位置信息以及滚动条位置 http://blog.csdn.net/qq_34095777/article/details/78750886 原文链接 原创 201 ...
- require()和include()代码重用
第五章 require()函数和include()函数几乎是相同的,二者唯一的区别在于函数失败后,require()函数将给出一个致命的错误,而include()只是给出一个警告. require_o ...
- 算法Sedgewick第四版-第1章基础-007一用两个栈实现简单的编译器
1. package algorithms.util; import algorithms.ADT.Stack; /****************************************** ...
- noi.ac day6t1 queen
传送门 分析 我就是个BT...... 直接排序后开数组记录每条线上的信息,注意由于每个点只会影响前面第一个点和后面第一个点,所以记录每条线的前一个点就行了. 代码 #include<iostr ...
- spark sql建表的异常
在使用spark sql创建表的时候提示如下错误: missing EOF at 'from' near ')' 可以看下你的建表语句中是不是create external table .... ...
- U盘刻录14.10镜像出问题的解决方法
从几个月前的14.10 daily 版本就有U盘刻录无法启动的现象,相关bug可参见:https://bugs.launchpad.net/ubunt ... reator/+bug/1325801 ...
- 在 Java 的反射中,Class.forName 和 ClassLoader 的区别
1. 解释 在java中Class.forName()和ClassLoader都可以对类进行加载.ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是“通过一个类的全 ...
- Gazebo学习随记3 图形界面的使用
直接写模型的SDF文件实在是太反人类啦! 可以在gazebo图形界面中设置好模型的链接(碰撞外观惯性),关节等等参数-然后生成SDF文件
- 温故而知新_C语言_define_宏
define defi ...