bzoj4890: [Tjoi2017]城市
【题意】
给出一棵带边权的树,删掉一条边,再加上一条相同权值的边,使得在保持新图仍是一棵树的情况下,最远点对距离最小,求出这个距离。
【题解】
枚举删掉哪条边,然后原图变成2棵树。
之后的加边肯定是加在2棵树重心的两端,dp一下即可。
再在所有情况取最小值。注意别只考虑通过新边的路径,还有2棵树内部直径要考虑。
【代码】
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int N=5005; 5 const int inf=2e9; 6 int l,s,sum,now,ans,n,a[N],b[N],c[N],dp[N][2],last[N],nxt[N<<1],to[N<<1],va[N<<1]; 7 bool vis[N]; 8 void add(int x,int y,int z) 9 { 10 nxt[++l]=last[x];last[x]=l;to[l]=y;va[l]=z; 11 nxt[++l]=last[y];last[y]=l;to[l]=x;va[l]=z; 12 } 13 void modif(int u,int s) 14 { 15 if (s>dp[u][0]) dp[u][1]=dp[u][0],dp[u][0]=s; 16 else if (s>dp[u][1]) dp[u][1]=s; 17 } 18 void dfs(int u,int f) 19 { 20 vis[u]=1; 21 for (int x=last[u];x;x=nxt[x]) 22 { 23 int v=to[x]; 24 if (v==f) continue; 25 dfs(v,u); 26 modif(u,dp[v][0]+va[x]); 27 } 28 } 29 void dfs2(int u,int f) 30 { 31 now=max(now,dp[u][0]+dp[u][1]); 32 s=min(s,max(dp[u][0],dp[u][1])); 33 for (int x=last[u];x;x=nxt[x]) 34 { 35 int v=to[x]; 36 if (v==f) continue; 37 if (dp[u][0]==dp[v][0]+va[x]) modif(v,dp[u][1]+va[x]); 38 else modif(v,dp[u][0]+va[x]); 39 dfs2(v,u); 40 } 41 } 42 void clr() 43 { 44 l=sum=now=0; 45 for (int i=1;i<=n;++i) last[i]=dp[i][0]=dp[i][1]=vis[i]=0; 46 } 47 int main() 48 { 49 scanf("%d",&n); 50 if (n==1) return puts("0"),0; 51 for (int i=1;i<n;++i) 52 scanf("%d%d%d",&a[i],&b[i],&c[i]); 53 ans=inf; 54 for (int i=1;i<n;++i) 55 { 56 for (int j=1;j<i;++j) add(a[j],b[j],c[j]); 57 for (int j=i+1;j<n;++j) add(a[j],b[j],c[j]); 58 for (int k=1;k<=n;++k) 59 if (!vis[k]) 60 { 61 dfs(k,0); 62 s=inf; 63 dfs2(k,0); 64 sum+=s; 65 } 66 ans=min(max(now,sum+c[i]),ans); 67 clr(); 68 } 69 printf("%d\n",ans); 70 return 0; 71 }
View Code
转载于:https://www.cnblogs.com/Bleacher/p/8630456.html
bzoj4890: [Tjoi2017]城市相关推荐
- BZOJ4890 Tjoi2017城市
显然删掉的边肯定是直径上的边.考虑枚举删哪一条.然后考虑怎么连.显然新边应该满足其两端点在各自树中作为根能使树深度最小.只要线性求出这个东西就可以了,这与求树的重心的过程类似. #include< ...
- [TJOI2017]城市(未解决)
[TJOI2017]城市 题意: 一棵树,现在要求你将一条边改变他的位置,(即改变左右所连接的端点,权值不变),修改后任意两点相互可达,且使得两个点之间的最大交通费用最小 题解: 有O(n^2)和O( ...
- BZOJ4890 洛谷3761:[TJOI2017]城市——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4890 https://www.luogu.org/problemnew/show/P3761 从加 ...
- P3761 [TJOI2017]城市
题目链接 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有 n 座城市,n-1 条高速公路,保证了任意两运城市之间都可以通过高速公路相互可达,但是通过一条高速公路需要收取 ...
- 退役前的做题记录1.0
退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...
- 2017.10.27涩会题大乱斗部分题解
A P3741 honoka的键盘 和昨天的T1一样, 枚举改哪一个 1 #include<cstdio> 2 #include<cstring> 3 #include< ...
- P3758 [TJOI2017]可乐
P3758 [TJOI2017]可乐 这个题是利用了邻接矩阵的性质 即:对于一个邻接矩阵\(E\),表示从\(E[i][j]\)到\(i\)到\(j\)路径长度为1的方案数是多少.那么\(E^k[i] ...
- 洛谷P3758 [TJOI2017]可乐
原题链接:洛谷P3758 [TJOI2017]可乐 题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: ...
- 洛谷 P3758 [TJOI2017]可乐
洛谷 P3758 [TJOI2017]可乐 Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行 ...
最新文章
- XCode5中新建工程后强制使用了ARC,如何去掉?
- JS操作iframe
- 波司登在“寒潮”下再创新高,羽绒服行业真的靠天吃饭?
- 推荐一个Windows下好用的终端程序:ConEmu
- linux100day(day3)--常用文本处理命令和vim文本编辑器
- 计算机组成与系统原理中的节拍是什么意思?
- C++11新特性 右值引用与移动语义
- 暑假集训 div1 B Derangement 交换数字 思维死角
- 多表查询, 聚集查询和分组查询
- 对职场橡皮人Say No(转)
- 全网首发:跟踪分析This parser does not support specification “null“ version “null“
- python3小程序代码_我想使用python写一个小程序作为练习,使用的是python3。
- python人口普查数据数据分析_7、Python 数据分析-Pandas人口分析案例
- 计算机台账管理需求分析,结合工作经验研究数据中心机房管理统计的需求和实方式论文...
- iOS新机 iPhoneXS max和iPhoneXR适配
- 男神程序员对准男神程序员们的忠告
- CrazyBox常见问题
- 【原创】开源OpenIM:轻量、高效、实时、可靠、低成本的消息模型
- 中国银联DNA手机支付接口
- PHP代码审计——任意文件删除漏洞(YXcms)
热门文章
- svm 高斯核为什么惩罚项越大_SVM分类器原来这么简单
- planning ADSO/aggregation level的计划功能
- BZOJ 3032 七夕祭
- Freeswitch内核研究之sofia
- android 使用shell模拟触屏_Android随笔之——用shell脚本模拟用户按键、触摸操作...
- BaseQuickAdapter刷新列表数据
- 关于SQL+NoSQL : NewSQL数据库
- MAB建模规范-Matlab建模规范
- 中国人民银行研究生部复习资料总结
- java毕业设计基于Bootstrap的读书网站设计与实现(附源码、数据库)