【jzoj5042】【最小直径】【树形动态规划】【贪心/结论】
来源:互联网 发布:java服务器是什么 编辑:程序博客网 时间:2024/05/18 12:02
题目大意
你有一个n个点m条边的森林,编号从0开始,边有边权,你现在要添加若干边权为L的边,满足:
1、最后n个点构成一颗树。
2、这棵树的直径尽量小。
请你求出这个最小的直径是多少。
解题思路
求出每一个连通块的半径,答案及第一大加第二大+L和第二大加第三大+2L取最大。
code
#include<set>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define LF double#define LL long long#define Min(a,b) ((a<b)?a:b)#define Max(a,b) ((a>b)?a:b)#define Fo(i,j,k) for(int i=j;i<=k;i++)#define Fd(i,j,k) for(int i=j;i>=k;i--)#define For(i,j) for(int i=Begin[j];i;i=Next[i])using namespace std;int const Mxn=5*1e5+9,Mxm=1e6+9,Inf=1e9;int N,M,L,Gra,Cntt,Ans,Begin[Mxn],Vis[Mxn],F[Mxn],F2[Mxn],Bel[Mxn],G[Mxn], To[Mxm],Len[Mxm],Next[Mxm];void Insert(int U,int V,int W){ To[++Gra]=V; Len[Gra]=W; Next[Gra]=Begin[U]; Begin[U]=Gra;}void GetF(int Now,int Pre){ Vis[Now]=1;Cntt++; For(i,Now)if(To[i]!=Pre){ GetF(To[i],Now); if(F[Now]<F[To[i]]+Len[i]){ F2[Now]=F[Now]; F[Now]=F[To[i]]+Len[i]; Bel[Now]=To[i]; }else if(F2[Now]<F[To[i]]+Len[i]){ F2[Now]=F[To[i]]+Len[i]; } }}void GetG(int Now,int Pre,int PLen){ if(Bel[Pre]==Now)G[Now]=Max(G[Pre],F2[Pre])+PLen; else G[Now]=Max(G[Pre],F[Pre])+PLen; if(Max(F[Now],G[Now])<Ans)Ans=Max(F[Now],G[Now]); For(i,Now)if(To[i]!=Pre) GetG(To[i],Now,Len[i]);}int main(){ //freopen("diameter.in","r",stdin); //freopen("diameter.out","w",stdout); freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%d%d%d",&N,&M,&L); if(N==1){ printf("0"); return 0; } int U,V,W,M1=0,M2=0,M3=0; Fo(i,1,M){ scanf("%d%d%d",&U,&V,&W);U++;V++; Insert(U,V,W);Insert(V,U,W); } int Size=0; Fo(i,1,N)if(!Vis[i]){ int Pre=Cntt; GetF(i,0); Ans=Inf; GetG(i,0,0); if(Ans){ if(Ans>M1)M3=M2,M2=M1,M1=Ans; else if(Ans>M2)M3=M2,M2=Ans; else if(Ans>M3)M3=Ans; } } int Anss=M1+M2+L; Fo(i,1,N)Anss=Max(Anss,F[i]+G[i]); if(M3)Anss=Max(Anss,M2+M3+L*2); printf("%d",Anss); return 0;}
0 0
- 【jzoj5042】【最小直径】【树形动态规划】【贪心/结论】
- 树形动态规划
- 树形动态规划
- 树形动态规划
- 选课 树形动态规划
- 将功补过 树形动态规划
- 电子眼 树形动态规划
- 树形动态规划总结
- 树形动态规划总结
- 树形动态规划
- 树形动态规划
- 【专题】树形动态规划
- 树形依赖动态规划
- [动态规划+数学结论]HOJ_12301_Eleven Lover
- poj1042 动态规划 贪心
- 贪心算法&动态规划
- 贪心&动态规划
- 动态规划和贪心
- COGS 826. [Tyvj Feb11] GF打dota (K短路)
- SQL Server 2005 导出 数据脚本
- STM32F10x下载口的用法
- lintcode(76)最长上升子序列
- Spark性能优化指南——高级篇
- 【jzoj5042】【最小直径】【树形动态规划】【贪心/结论】
- 1042. 字符统计(20)
- C#里partial关键字的作用
- STL适配器之stack
- Spark性能优化指南——基础篇
- 读书笔记-分层架构
- 蓝桥 ADV-230 算法提高 12-1三角形 【数学公式】
- 动态分配二维数组
- 简单的ReactNative工程