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的更多相关文章

  1. 【IOI2013】【Bzoj3246】Dreaming

    http://www.lydsy.com/JudgeOnline/problem.php?id=3246 中文题面 天地之初,世界尚在遥远的梦想之中. Serpent(水蛇)生活的地方有N个水坑,编号 ...

  2. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  3. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  4. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  6. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  7. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  8. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  9. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

随机推荐

  1. uGUI练习 开篇

    一.准备阶段 1.Unity 4.6 Beta b18或更高版本(注:目前泄露版的Unity5.0Beta 对UI的支持并没有4.6 Beta那么好) 2.了解 Unity 2D Sprite的基础知 ...

  2. Linux命令学习-date

    date命令可以用来显示和修改系统日期时间,注意不是time命令. 1.在命令行输入date显示当前时间 [root@vm4 logs]# dateSat Nov 22 00:00:02 CST 20 ...

  3. Java Executor并发框架(三)ThreadPoolExecutor 队列缓存策略

    前面两篇讲解了线程池中线程创建后的运行情况,其中有一系列的策略来保证线程正常运行.但是我们知道线程池是可以设置容量的,而且这容量的设置也是至关重要的,如果容量设置的太小,那么将会影响系统的运行效率,如 ...

  4. java7-3 继承

    1.继承概述: 把多个类中相同的内容给提取出来定义到一个类中. 如何实现继承呢? Java提供了关键字:extends 格式: class 子类名 extends 父类名 {} 父类也称为基类.超类: ...

  5. escape()、encodeURI()、encodeURIComponent()区别详解

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...

  6. 使用DataAnnotations实现数据验证

    https://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.aspx http://www.cnblo ...

  7. 实战:ADFS3.0单点登录系列-总览

    本系列将以一个实际项目为背景,介绍如何使用ADFS3.0实现SSO.其中包括SharePoint,MVC,Exchange等应用程序的SSO集成. 整个系列将会由如下几个部分构成: 实战:ADFS3. ...

  8. 静态时序分析(static timing analysis) --- 时序路径

    时序分析工具会找到且分析设计中的所有路径.每一个路径有一个起点(startpoint)和一个终点(endpoint).起点是设计中数据被时钟沿载入的那个时间点,而终点则是数据通过了组合逻辑被另一个时间 ...

  9. C语言 数组做函数参数不传数组个数的遍历方法

    //数组做函数参数不传数组个数的遍历方法 #include<stdio.h> #include<stdlib.h> #include<string.h> void ...

  10. linux内核分析 第七周

    一.课堂相关 (一)预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 C代码--预处理--汇编代码--目标代码--可执行文件 预处理负责把include的文件包含进来及宏替换工作. he ...