【bzoj3246】 Ioi2013—Dreaming
www.lydsy.com/JudgeOnline/problem.php?id=3246 (题目链接)
题意
给出一棵不完全的树,要求在树上连最少的边使得所有点联通,并且使得两点间最大距离最小。
Solution
今天考试题,有情况没考虑到。。。
http://www.ccf.org.cn/resources/1190201776262/fujian/xuhaoran2013-07-25-03_33_55.pdf
做法的话其实很简单。我们先把每个连通块两遍dfs,O(n)的找出块内的“接点”和直径,至于怎么找,自己YY一下吧,很简单的。然后考虑将所有连通块联通,不妨将每个连通块看成一个点,将连通块内到“接点”的最远距离看成点权,那么一定是连成一棵菊花树。
答案一共有3种情况。第一,是一个连通块内的直径。第二,是点权最大和次大的两个连通块之间的距离。第三是点权次大和次次大的连通块之间的距离。
代码
// bzoj3246
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=500010;
struct edge {int to,next;LL w;}e[maxn<<1];
LL vis[maxn],head[maxn],a[maxn],f[maxn][2],son[maxn];
LL cnt,sum,n,m,L,tt,tmp,d,ans; void link(int u,int v,LL w) {
e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].w=w;
e[++cnt].to=u;e[cnt].next=head[v];head[v]=cnt;e[cnt].w=w;
}
bool cmp(LL a,LL b) {
return a>b;
}
void dfs1(int x,int fa) { //x的子树中到x的最远距离和次远距离
vis[x]=1;
for (int i=head[x];i;i=e[i].next) if (!vis[e[i].to]) {
dfs1(e[i].to,x);
if (f[e[i].to][0]+e[i].w>f[x][0]) {
son[x]=e[i].to;f[x][0]=f[e[i].to][0]+e[i].w;
}
}
for (int i=head[x];i;i=e[i].next)
if (e[i].to!=fa && e[i].to!=son[x]) f[x][1]=max(f[x][1],f[e[i].to][0]+e[i].w);
}
void dfs2(int x,LL d,int fa) { //整棵树到x的最远距离
if (d>f[x][0]) {
f[x][1]=f[x][0];son[x]=fa;f[x][0]=d;
}
else if (d>f[x][1]) f[x][1]=d;
tt=min(tt,f[x][0]);
ans=max(ans,f[x][0]);
for (int i=head[x];i;i=e[i].next) if (e[i].to!=fa) {
if (e[i].to!=son[x]) dfs2(e[i].to,f[x][0]+e[i].w,x);
else dfs2(e[i].to,f[x][1]+e[i].w,x);
}
}
int main() {
scanf("%lld%lld%lld",&n,&m,&L);
for (int u,v,i=1;i<=m;i++) {
LL w;
scanf("%d%d%lld",&u,&v,&w);
link(u,v,w);
}
for (int i=0;i<n;i++) if (!vis[i]) {
tt=inf;
dfs1(i,n);
dfs2(i,0,n);
a[++sum]=tt;
}
sort(a+1,a+1+sum,cmp);
if (sum>=2) ans=max(ans,a[1]+a[2]+L);
if (sum>=3) ans=max(ans,a[2]+L+L+a[3]);
printf("%lld",ans);
return 0;
}
【bzoj3246】 Ioi2013—Dreaming的更多相关文章
- 【IOI2013】【Bzoj3246】Dreaming
http://www.lydsy.com/JudgeOnline/problem.php?id=3246 中文题面 天地之初,世界尚在遥远的梦想之中. Serpent(水蛇)生活的地方有N个水坑,编号 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
随机推荐
- 使用Loadrunner进行http接口压力测试
业务描述: 在业务系统里进行查询操作,查询的结果是通过请求http接口,从系统中处理并将结果以json字符串返回. 本文就讲述使用Loadrunner对此类接口进行压力测试并记录相关的性能指标数据: ...
- C#代码规范 .NET程序员需要提升的修养
一. 环境设置 首先去除VS开发环境中的一些选项如下: 粘贴时调整缩进 将类型的左大括号置于新行 将方法的左大括号置于新行 将匿名方法的左大括号置于新行 将控制块的左大括号置于新行 将“else” ...
- Linux下CGroup使用说明梳理
CGroup 介绍CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制.记录.隔离进程组 (process groups) 所使用的物力资源 (如 cpu m ...
- javascript中的数组操作
1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...
- 工作流模式与K2实现- (1)
背景 工作流产品众多,而它们之间又缺乏统一的标准,使得不同的产品之间很难实现协同工作.为了解决这一问题,工作流管理联盟(WFMC)于1993 年成立,并提出了工作流参考模型,制定了五个标准接口. 其中 ...
- [DE2i-150] 重建PCIe_Fundmental範例說明
以下資料的整理主要是做備忘錄,避免以後忘了,順便留給需要的人. ========================================== 本文主要是參考友晶科技的DE2i-150光碟裡面的 ...
- struts2中简单的文件上传
2016-08-31 一. 文件上传 利用commons-fileupload-1.2.1.jar实现简单的上传文件,首先在页面上填写表单,记得加上enctype="multip ...
- Download the WDK, WinDbg, and associated tools
Download the WDK, WinDbg, and associated tools This is where you get your Windows Driver Kit (WDK) a ...
- C语言 数组做函数参数退化为指针的技术推演
//数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组 ...
- 发发关于JavaScript的感慨,随手记几个js知识碎片
最近一段时间写了很多JavaScript和jquery代码,越来越感觉js基础不牢固,写一句查半天,有时间肯定要系统的学一下. 不说了,先记一下最近学到的点东西,省的以后没时间系统学js还要再来查. ...