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. java 13-4 Integer和String、int之间的转换,进制转换

    1.int类型和String类型的相互转换 A.int -- String 推荐用: public static String valueOf(int i) 返回 int 参数的字符串表示形式. B. ...

  2. C# WinForm 中Console 重定向输出到ListBox控件中显示

                        {              VoidAction action =              {                  lstBox.Items. ...

  3. ArcGIS实现在线与线交叉处打断线(批量)

    from:http://he1989.blog.163.com/blog/static/2052041092012631112459704/ 打开ArcgisDesktop中的ArcToolBox 找 ...

  4. Bitbucket免费的私有仓库

    1.官网 https://bitbucket.org/ 2.介绍 知乎:http://www.zhihu.com/question/20053312 建议同时用Bitbucket和Github,理由如 ...

  5. WPF RadioButton 转换

    模型 public class people { public string name{get;set;} public bool? sex{get;set;} } 转换器 namespace Hel ...

  6. java读取文件批量插入记录

    只是一个例子,方便以后查阅. import ey.db.oracle.OracleHelper; import ey.db.type.*; import java.io.BufferedReader; ...

  7. winform listbox与textbox组合提示框 模糊查询

      private void listbox1_MouseClick(object sender, MouseEventArgs e)        {            textbox1.Vis ...

  8. 从Python爬虫到SAE云和微信公众号:二、新浪SAE上搭建微信服务

    目的:用PHP在SAE上搭建一个微信公众号的服务器. 1.申请一个SAE云账号 SAE申请地址:http://sae.sina.com.cn/  可以使用微博账号登陆,SAE是新浪的云服务,时间也比较 ...

  9. 异步编程 In .NET(转)

    转自:http://www.cnblogs.com/jesse2013/p/Asynchronous-Programming-In-DotNet.html 概述 在之前写的一篇关于async和awai ...

  10. 20155224聂小益 - 我的技能与C语言学习

    20155224聂小益 - 我的技能与C语言学习 预备作业2 ● 你有什么技能比大多人(超过90%以上)更好? 我认为我可能有些技能身边有的人比较少有,但是要是超过90%以上我实在不敢保证.毕竟厉害的 ...