link

一道非常类似的题目(link)

试题大意

给你一棵含有$n$个节点的有边权森林,问每次连边将会用$L$的代价,问你若此图通过加边成为树时的最小直径。$n \leq 5\times 10^5$

试题分析

我们可以发现若两棵树要是在合并连接的点一定与树的中心有关。树的中心指对于当$i$为根时,子树上权值和最大的最小。

为什么,应为树的直径的情况只有单独一棵树,两棵树和在一起的,且那时要是合并就是的是树的中心。但其实$CF$那题应该求树的中心也行,因为那是边权都会为$1$.

所以会发现其实应该如果说要把树建完以后会发现是一个菊花树,且根为权重最大的联通块的根。因为若是小的当根的话那么就会多算了一颗树,所以最多只需要算两颗即可。

所以说我们每次处理好中心到叶子节点的最大距离是多少,然后就可以直接去计算答案了。

并且为什么最多只要算到联通块个数$\leq 3$呢,因为刚才说了这是一颗菊花图,所以我们最多有用的其实是两颗子树。

IOI2013

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int N=;
struct node{
int u,v,w,nex;
}x[N<<];
int cnt,head[N],n,m,l;
void add(int u,int v,int w){
x[cnt].u=u,x[cnt].v=v,x[cnt].w=w,x[cnt].nex=head[u],head[u]=cnt++;
}
int dp[N][],dis[N],col,vis[N],son[N];
/*0最长 1 次长*/
void dfs1(int f,int fath){
vis[f]=;
for(int i=head[f];i!=-;i=x[i].nex){
if(x[i].v==fath) continue;
dfs1(x[i].v,f);
if(dp[x[i].v][]+x[i].w>=dp[f][]){dp[f][]=dp[f][];dp[f][]=dp[x[i].v][]+x[i].w,son[f]=x[i].v;}
else if(dp[x[i].v][]+x[i].w>dp[f][]){dp[f][]=dp[x[i].v][]+x[i].w;}
}
return;
}
int ans,k;
void dfs2(int f,int fath,int Dis){
if(Dis>dp[f][]){
dp[f][]=dp[f][];dp[f][]=Dis;son[f]=fath;
}
else if(Dis>dp[f][]){dp[f][]=Dis;}
ans=max(ans,dp[f][]);k=min(k,dp[f][]);
for(int i=head[f];i!=-;i=x[i].nex){
if(x[i].v==fath) continue;
if(son[f]==x[i].v) dfs2(x[i].v,f,dp[f][]+x[i].w);
else dfs2(x[i].v,f,dp[f][]+x[i].w);
}
}
int calc[N];
signed main(){
memset(head,-,sizeof(head));
n=read(),m=read(),l=read();
for(int i=;i<=m;i++){
int u=read()+,v=read()+,w=read();
add(u,v,w),add(v,u,w);
}
for(int i=;i<=n;i++){
if(!vis[i]){
dfs1(i,);
k=INT_MAX;
dfs2(i,,);
calc[++col]=k;
}
}
sort(calc+,calc+col+);
if(col>=) ans=max(ans,calc[col]+calc[col-]+l);
if(col>=) ans=max(ans,calc[col-]+calc[col-]+*l);
printf("%d",ans);
}

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int N=;
struct node{
int u,v,w,nex;
}x[N<<];
int cnt,head[N],n,m,l;
void add(int u,int v,int w){
x[cnt].u=u,x[cnt].v=v,x[cnt].w=w,x[cnt].nex=head[u],head[u]=cnt++;
}
int dp[N][],dis[N],col,vis[N],son[N];
/*0最长 1 次长*/
void dfs1(int f,int fath){
vis[f]=;
for(int i=head[f];i!=-;i=x[i].nex){
if(x[i].v==fath) continue;
dfs1(x[i].v,f);
if(dp[x[i].v][]+x[i].w>=dp[f][]){dp[f][]=dp[f][];dp[f][]=dp[x[i].v][]+x[i].w,son[f]=x[i].v;}
else if(dp[x[i].v][]+x[i].w>dp[f][]){dp[f][]=dp[x[i].v][]+x[i].w;}
}
return;
}
int ans,k,pos;
struct Node{
int pos,calc;
}S[N<<];
void dfs2(int f,int fath,int Dis){
if(Dis>dp[f][]){
dp[f][]=dp[f][];dp[f][]=Dis;son[f]=fath;
}
else if(Dis>dp[f][]){dp[f][]=Dis;}
ans=max(ans,dp[f][]);k=min(k,dp[f][]);
if(dp[f][]==k) pos=f;
for(int i=head[f];i!=-;i=x[i].nex){
if(x[i].v==fath) continue;
if(son[f]==x[i].v) dfs2(x[i].v,f,dp[f][]+x[i].w);
else dfs2(x[i].v,f,dp[f][]+x[i].w);
}
}
bool cmp(Node x1,Node x2){return x1.calc<x2.calc;}
signed main(){
memset(head,-,sizeof(head));
n=read(),m=read(),l=;
for(int i=;i<=m;i++){
int u=read(),v=read(),w=;
add(u,v,w),add(v,u,w);
}
for(int i=;i<=n;i++){
if(!vis[i]){
dfs1(i,);
k=INT_MAX;
dfs2(i,,);
S[++col].calc=k;
S[col].pos=pos;
}
}
sort(S+,S+col+,cmp);
if(col>=) ans=max(ans,S[col].calc+S[col-].calc+l);
if(col>=) ans=max(ans,S[col-].calc+S[col-].calc+*l);
printf("%d\n",ans);
for(int i=col-;i>=;i--) cout<<S[col].pos<<" "<<S[i].pos<<endl;
}

CF

[IOI2013]Dreaming的更多相关文章

  1. bzoj 3246 [Ioi2013]Dreaming 贪心

    [Ioi2013]Dreaming Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 638  Solved: 241[Submit][Status][Di ...

  2. 【bzoj3246】 Ioi2013—Dreaming

    www.lydsy.com/JudgeOnline/problem.php?id=3246 (题目链接) 题意 给出一棵不完全的树,要求在树上连最少的边使得所有点联通,并且使得两点间最大距离最小. S ...

  3. BZOJ3246 [Ioi2013]Dreaming

    Description Serpent(水 蛇)生活的地方有N个水坑,编号为0,...,N - 1,有M条双向小路连接这些水坑.每两个水坑之间至多有一条路径(路径包含一条或多条小路)相互连接,有些水坑 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 【IOI2013】【Bzoj3246】Dreaming

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

  6. 读书笔记:《梦断代码Dreaming in Code》

    读书笔记:<梦断代码Dreaming in Code> 拿到<梦断代码>书后,一口气翻了一遍,然后又用了3天时间仔细读了一遍,也不禁掩卷长叹一声,做软件难.虽难,仍要继续走下去 ...

  7. BZOJ3249 : [ioi2013]game

    线段树套Treap 外层的线段树需要动态开节点 内层Treap需要注意的是,相同y坐标的点不一定是同一个点,所以需要再次离散 空间$O(n\log n)$ 时间$O(n\log^2n)$ #inclu ...

  8. 《梦断代码Dreaming In Code》阅读笔记(三)

    最后这几章感觉上更多是从软件完成整体上来讲的.比如说技术.方法等. 在我看来,其实一个团队一直坚持一种好的.先进的方法是不可少的.如果一个优秀的团队刚愎自用,只随着成员们喜好发展,那不能长久.比如说, ...

  9. 《梦断代码Dreaming In Code》阅读笔记(二)

    这段时间一口气读了5章,所以想着现在一块写阅读笔记. 在阅读的这段时间,我一直是晚上进行阅读,很多时候都是读完一看已经一个小时了,效果还不错.闲话不表,说说阅读心得. 关于底层语言或是低级语言,我之前 ...

随机推荐

  1. OA系统与Exchange 日历打通

    目前我碰到好几个案例是希望将客户以后的OA系统与Exchange中的日历系统相结合,比如致远或者泛微的OA系统. 客户的需求如下: 1.有了OA系统 2.客户使用Outlook当邮件客户端 3.客户希 ...

  2. 小数第n位:高精度

    小数第n位 问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后 ...

  3. hadoop2.7.1安装和部署

    操作系统:Red Hat Enterprise Linux Server release 6.2 (Santiago) hadoop2.7.1 三台redhat linux主机,ip分别为10.204 ...

  4. loadrunner11--基础使用

    每次开启电脑都需要破解一次Lr,汉化版的有问题,建议使用英文版的.我测试的环境是Windows7+IE8+LR11.(在Windows10上试过,谷歌和IE11都不能正常运行),以下我会具体来操作,最 ...

  5. Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理

    本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...

  6. USACO 1.3.2 Barn Repair 修理牛棚(贪心)

    Description 在一个夜黑风高,下着暴风雨的夜晚,农民约翰的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 剩下的牛一个紧挨着另一个被排成一行来过夜. 有些牛棚里有牛,有些没 ...

  7. Fiber Network ZOJ 1967(Floyd+二进制状态压缩)

    Description Several startup companies have decided to build a better Internet, called the "Fibe ...

  8. Thunder团队第七周 - Scrum会议3

    Scrum会议3 小组名称:Thunder 项目名称:i阅app Scrum Master:李传康 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...

  9. 按Right-BICEP要求的测试用例

    测试方法:Right-BICEP 测试计划 1.Right-结果是否正确? 2.B-是否所有的边界条件都是正确的? 3.P-是否满足性能要求? 4.结果是否有符合要求的20道题目? 5.所得到的最大数 ...

  10. jsp取不到值栈的值

    是否页面用的重定向? <result name="addsuccess"  type="redirect"> ? 去掉type="redi ...