[TJOI2017]城市(未解决)

[TJOI2017]城市

题意:

一棵树,现在要求你将一条边改变他的位置,(即改变左右所连接的端点,权值不变),修改后任意两点相互可达,且使得两个点之间的最大交通费用最小

题解:

有O(n^2)和O(n)两种做法


参考题解:
参考1
参考2
再有研究分析半小时后,我会了O(n^2)的做法:
我们可以暴力删除一个边,O(n)
然后处理最远点对的问题O(n)
这个最远点对怎么考虑?
当删除一个边后,整棵树就被分成两个联通块,此时的最长路由三种来源:

  1. 最远点对都在连通块1
  2. 最远点对都在连通块2
  3. 最远点对分别在连通块1和2

前两种情况本质就是分别求树的直径,拿第三种情况呢?我们设最远点对分别是u,v
u在连通块1,v在2
那么答案就是u到连通块1任意一点的最长距离+val(当初被删的边的边权)+v在连通块2任意一点的最长距离
最终答案是要求这三种情况的最大值尽可能小,而前两种情况是固定的(在删完边之后就是固定的),所有我们就要让第三种情况中两个点的到自己联通块的最长距离最小。这就是最优策略
具体做法:
我们一边做树形dp,一边求出对于每一个子树,求出经过它的最长链和次长链。直径就是枚举每个点,求max(最长链+次长链)
而我们要求点x在连通块内的最远距离(另一端为y),
y有可能在x的子树内,那len(x,y)就是上面求得最长链。
y如果在子树外,len(x,y)就等于x到父亲fa的距离+from
from有两个来源:
1.在父亲子树之外的最长链
2.在父亲子树之内的最长链
对于第2种情况,如果x在就在父亲子树的最长链上,那么我们就要取次长链,否则就是最长链
?这句话什么意思?我们是通过换根操作,用父亲子树的最长链来求x的最长链,如果x在父亲子树的最长链,换根就会影响最长链,所以要用次长链
通过下图理解理解
在这里插入图片描述

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=5010;const int INF=0x3f3f3f3f;
struct data{int v;int nxt;int val;}edge[2*N];
int alist[N];int cnt;int n;
inline void add(int u,int v,int val)
{edge[++cnt].v=v;edge[cnt].nxt=alist[u];alist[u]=cnt;edge[cnt].val=val;}
int dp[N];int mv[N];int nxdp[N];bool book[N];int rad=INF;int dis;int res=INF;
void getd(int x)//求直径 
{book[x]=true;int nxt=alist[x];while(nxt){int v=edge[nxt].v;int val=edge[nxt].val;if(!book[v]){getd(v);int va=dp[v]+val;//最长链和次长链 if(va>dp[x]){//如果大于最大的 nxdp[x]=dp[x];dp[x]=va;mv[x]=v;//在最长链上,x的下一位是v }else if(va>nxdp[x]){//大于第二大 nxdp[x]=va;}}nxt=edge[nxt].nxt;}dis=max(dis,dp[x]+nxdp[x]);//更新直径 
}
void getr(int x,int fr)
{rad=min(rad,max(fr,dp[x]));//更新半径 book[x]=false;int nxt=alist[x];while(nxt){int v=edge[nxt].v;int val=edge[nxt].val;if(book[v]){if(v==mv[x]){//如果在最长链 getr(v,max(nxdp[x]+val,fr+val));// nxdp[x]+val 就是次长链+val //fr 他父亲的from }else { getr(v,max(dp[x]+val,fr+val));//否则就是最长链+val }}nxt=edge[nxt].nxt;}
}
inline void clear(){//清空dp的函数 for(int i=1;i<=n;i++){dp[i]=mv[i]=nxdp[i]=book[i]=0;}rad=INF;dis=0;
}
int u[N];int v[N];int val[N];
int main()
{scanf("%d",&n);for(int i=1;i<n;i++)//读进来 {scanf("%d%d%d",&u[i],&v[i],&val[i]);add(u[i],v[i],val[i]);add(v[i],u[i],val[i]);}for(int i=1;i<n;i++)//枚举边 {int d1;int d2;int r1;int r2;book[v[i]]=1;getd(u[i]);d1=dis;//求直径 dis=0;getd(v[i]);d2=dis;//求直径 book[v[i]]=0;getr(u[i],0);r1=rad;//求半径 rad=INF;getr(v[i],0);r2=rad;//求半径 res=min(res,max(max(d1,d2),r1+r2+val[i]));//更新答案 clear();//不要忘记清空 }printf("%d",res);return 0;//拜拜程序~ 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数论三之组合数学Ⅰ-Max-Min Sums,Binomial Coefficient is Fun,Strivore,Bubble Sort,放棋子,LOJ6671,Iroha and a Grid

组合计数我最爱Max-Min SumsdescriptionsolutioncodeBinomial Coefficient is FundescriptionsolutioncodeStrivoredescriptionsolutioncodeBubble Sortdescriptionsolutioncode[HAOI2016]放棋子descriptionsolutioncodeEntropyIncreaser 与 MinecraftdescriptionsolutioncodeD…

12.15模拟:总结

前言 20分 《好耶》 很好的把所有错误都犯了一遍。 8&#xff1a;30写完AB题 11&#xff1a;00还是只写完AB题, T1代码没有提交 T2数组算错空间全RE T3快结束了发现CE了删掉第二档后还交成了之前写的失败版本(结果靠这破玩意水到了仅有的20分) T4考场其实猜到了结论但没证出来…

语言之争与读书有感

移动互联网无处不在的今天&#xff0c;不同的学习方式让我们受益颇多。有人喜欢通过手机阅读各类技术专家的公众号分享&#xff1b;有人喜欢通过逛逛不同的博客&#xff0c;来了解当前时下的技术&#xff1b;也有人喜欢通过社区的形式&#xff0c;跟优秀的导师们一起梳理和发展…

CF566E-Restoring Map【bitset】

正题 题目链接:https://www.luogu.com.cn/problem/CF566E 题目大意 有一棵树&#xff0c;但是你不知道它的形态。你现在只知道距离每个点距离不超过222的点集&#xff0c;但是你不知道每个点集是对应哪个点的。 现在要你求这棵树。 2≤n≤10002\leq n\leq 10002≤n≤1000 解…

所有人都可以是开发人员——《Office 365开发入门指南》视频教程即将上市

今天是春节假期的最后一天&#xff0c;在这里给全国的朋友们拜个晚年&#xff0c;祝大家身体健康&#xff0c;晚年幸福啊。这个春节大家过的怎么样啊&#xff0c;我自己是在老家过的年&#xff0c;家乡的年味还是比较浓的&#xff0c;也再次感谢朋友圈的大家给我看了各地的风光…

CodeForces: 360(div1)361(div2)

文章目录前言CF361A Levko and TableDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF361B Levko and PermutationDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF360A Levko a…

数论三之排列组合Ⅱ——Virus Tree 2,RGB Coloring,123 Triangle,排列计数,排队,卡农

丝且人一口Virus Tree 2descriptionsolutioncodeRGB Coloringdescriptionsolutioncode123 Triangledescriptionsolutioncode[SDOI2016]排列计数descriptionsolutioncode[HNOI2012]排队descriptionsolutioncode[HNOI2011]卡农descriptionsolutioncodeVirus Tree 2 description …

B - Labyrinth Gym - 102798B

B - Labyrinth Gym - 102798B 题意&#xff1a; n * m的地图&#xff0c;有k个障碍物&#xff0c;给你起点到终点&#xff0c;从起点到终点的最短距离 1<n,m<200000 nm<200000 0<k<42 1<q<100000 题解&#xff1a; 如果没有障碍物&#xff0c;两点之间…

P2483-[模板]k短路/[SDOI2010]魔法猪学院【主席树,堆】

正题 题目链接:https://www.luogu.com.cn/problem/P2483 题目大意 给出一个nnn个点mmm条边的一张带权有向图&#xff0c;求一个最大的kkk使得1∼n1\sim n1∼n的前kkk短路径长度和不超过EEE。 2≤n≤5000,1≤m≤2105,1≤E≤1072\leq n\leq 5000,1\leq m\leq 2\times 10^5,1\le…

.NET Core开发日志——OData

简述OData&#xff0c;即Open Data Protocol&#xff0c;是由微软在2007年推出的一款开放协议&#xff0c;旨在通过简单、标准的方式创建和使用查询式及交互式RESTful API。类库在.NET Core中想要使用OData功能的话需要添加Microsoft.AspNetCore.OData包。dotnet add package M…

数论四之综合训练——Magic Pairs,Crime Management,Top Secret,组合数问题

数论综合训练Magic PairsproblemsolutioncodeCF107D Crime ManagementproblemsolutioncodeUVA12183 Top SecretproblemsolutioncodeP3746 [六省联考2017]组合数问题problemsolutioncodeMagic Pairs problem 已知A0xB0y≡0(modn)A_0xB_0y\equiv 0\pmod nA0​xB0​y≡0(modn)恒…

P6776-[NOI2020]超现实树

正题 题目链接:https://www.luogu.com.cn/problem/P6776 题目大意 定义一次操作为将一棵树的叶子换成另一棵树。 定义一棵树TTT的grow(T)grow(T)grow(T)表示所有树TTT能够通过操作变成的树的集合。 现在给出mmm棵树TiT_iTi​&#xff0c;定义SSS为所有grow(Ti)grow(T_i)grow…

CodeForces:749(div1)750(div2)

文章目录前言CF450A Jzzhu and ChildrenDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF450B Jzzhu and SequencesDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF449A Jzzhu …

Steins;Game Gym - 102798J(未解决)

Steins;Game Gym - 102798J 题意&#xff1a; 给定n堆石子a&#xff0c;每堆石子被染成了黑色或者白色&#xff0c;现在两个人轮流进行以下的其中一个操作&#xff1a; 1、从石子数量最少的一个黑色石堆中拿走若干石子 2、从任意一个白色石堆中拿走若干石子 两个人都采取最优…

ML.NET 0.10特性简介

IDataView被单独作为一个类库包IDataView组件为表格式数据提供了非常高效的处理方式&#xff0c;尤其是用于机器学习和高级分析应用。它被设计为可以高效地处理高维数据和大型数据集。并且也适合处理属于更大的分布式数据集中的单个数据区块结点。在ML.NET 0.10中&#xff0c;I…

模板:模拟退火

文章目录前言解析流程示例代码trick所谓模拟退火&#xff0c;就是通过代码模拟退火 &#xff08;逃&#xff09; 前言 终于学了这个神奇的骗分算法 几次在大赛中都发现这算法是真的有学的必要 FFC可能真的要想想自己的题目对OI界的导向作用了 但学完以后还是感觉挺有意思的&a…

讨“动态规划“檄

我一直遵循着人不犯我我不犯人的原则&#xff0c;但是鉴于动态规划(dp)三番两次的挑衅&#xff0c;我忍无可忍决定发起反击&#xff0c;特写本文记录一下。 (本文整理一下以前做过的dp问题&#xff0c;并且把之前囤的大量dp都做做) acwing提高组 第一章 动态规划 背包模型题目集…

数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

容斥的神[HAOI2008]硬币购物problemsolutioncodeCF559C Gerald and Giant Chessproblemsolutioncode[SCOI2010]幸运数字problemsolutioncodeCF997C Sky Full of Starsproblemsolutioncode已经没有什么好害怕的了problemsolutioncode[JLOI2015]骗我呢problemsolutioncode容斥要么…

P4769-[NOI2018]冒泡排序【组合数学,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P4769 题目大意 有一个冒泡排序的算法 输入&#xff1a;一个长度为 n 的排列 p[1...n] 输出&#xff1a;p 排序后的结果。 for i 1 to n dofor j 1 to n - 1 doif(p[j] > p[j 1])交换 p[j] 与 p[j 1] 的值然后给出一…

NET Core微服务之路:基于Ocelot的API网关Relay实现--RPC篇

前言我们都知道&#xff0c;API网关是工作在应用层上网关程序&#xff0c;为何要这样设计呢&#xff0c;而不是将网关程序直接工作在传输层、或者网络层等等更底层的环境呢&#xff1f;让我们先来简单的了解一下TCP/IP的五层模型。&#xff08;图片出自http://www.cnblogs.com/…