bzoj3124 [Sdoi2013]直径 直径+树形dp
这个题标签为什么会有网络流。。
首先树的直径求法就是两遍dfs
然后以其中一个为树的根,统计子树到节点的最长距离与次长距离:
符合条件的点一定是最长距离唯一的,且次长距离与到根的距离不相等
注:
1、同级语句的顺序
2、long long
码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 500000
int hou[N],tot,xia[N],a,b,c,fu[N],zhong[N],id[N],ans,n,m,i,j;
long long v[N],d[N],d2[N],maxx;
void jian(int a,int b,long long c)
{++tot;hou[tot]=xia[a];xia[a]=tot;zhong[tot]=b;v[tot]=c;
}
void jia(int a,int b,long long c)
{jian(a,b,c);jian(b,a,c);
}
void dfs(int o,int fa)
{
int i;
d[o]=0;
id[o]=o;
for(i=xia[o];i!=0;i=hou[i])
{
int nd=zhong[i];
if(nd==fa)continue;
dfs(nd,o);
if(d[nd]+v[i]>d[o])d[o]=d[nd]+v[i],id[o]=id[nd];
}
}
void dp(int o,int fa)
{int i;fu[o]=fa;id[o]=0;for(i=xia[o];i!=-1;i=hou[i]){int nd=zhong[i];if(nd==fa)continue;dp(nd,o);if(d[nd]+v[i]==d[o]){id[o]=1;}else if(d[nd]+v[i]>d[o]){id[o]=0;d2[o]=d[o];d[o]=d[nd]+v[i];}else if(d[nd]+v[i]>d2[o])d2[o]=d[nd];}
}
int main()
{ memset(xia,-1,sizeof(xia));scanf("%d",&n);for(i=1;i<n;i++){scanf("%d%d%d",&a,&b,&c);jia(a,b,c); }dfs(1,0);int st=id[1];dfs(st,0);int nd=id[st];maxx=d[st];printf("%lld\n",maxx);memset(d,0,sizeof(d));dp(st,0);int o=nd,ans=0;while(o){//cout<<o;if(id[o]==1&&d2[o]==maxx-d[o]){ans=0;break;}if(d2[o]==maxx-d[o]){break;}if(id[o]==0){++ans;}if(id[o]==1){ans=1;}o=fu[o];}if(o==st)ans--;printf("%d",ans);
}
bzoj3124 [Sdoi2013]直径 直径+树形dp相关推荐
- [BZOJ3197][Sdoi2013]assassin(树形DP+树同构+二分图最优匹配)
关于树同构,有一个神奇的性质: 一棵树的重心只有 111 个或 2" role="presentation" style="position: relative ...
- 图论--树的直径--DFS+树形DP模板
#include <iostream> #include <cstring> using namespace std;//maxv:源点能到的最远点,maxdis:最远点对应的 ...
- Acwing1072 树的最长路径(树的直径)树形Dp 记忆化搜索
题目描述 原题链接: https://www.acwing.com/problem/content/1074/ 思路 以下针对树的边权都一样的情况. 推荐使用BFS, 比赛的时候栈空间只有1MB,DF ...
- HDU - 6769-In Search of Gold-二分+树形dp
https://vjudge.net/problem/HDU-6769 题目大意:给你n个点,有n-1条边,每条边有a,b两个权值,给你一个k,恰好有k条边的权值取a,其余取b的时候,树的直径的最小值 ...
- codeforces 1083 A. The Fair Nut and the Best Path(树形dp)
题目大意: 每个节点都给定一个值a[i],从一个节点走到另一个节点会消耗固定值w,但也会得到这个节点的价值,问怎样走才能得到最大的价值. 解题思路: 这个题和树形dp求树的直径差不多(树形DP基本都是 ...
- 树上子链(树形dp求树的直径)
树上子链 题意: 给定一棵树 T ,树 T 上每个点都有一个权值. 定义一颗树的子链的大小为:这个子链上所有结点的权值和 . 请在树 T 中找出一条最大的子链并输出. 题解: 求树的直径,题目中存在负 ...
- C++剑指offer:[POJ]2631 Roads in the North - 用树形DP的方式求出一棵树的直径
前言 此题是道很简单的题(做法不单一,不仅只有树形DP的方法) 做完了这道题才发现此题原来是一道求树的直径的题,也就是求树上两个节点的最大距离. 题目 问题 N(2692): [POJ2631]北极地 ...
- [WC2018]通道——边分治+虚树+树形DP
题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...
- hdu2196 树形DP
题意: 给你一棵树,求出每一个点到其他点的最大距离. 思路: 每个点的最大距离只有两种情况,1是自己忘下面走的最大,二是网上走的最大,取他们的最大便是答案,每个点网下面的最大可 ...
- POJ 1655 Balancing Act[树的重心/树形dp]
Balancing Act 时限:1000ms Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered ...
最新文章
- 总结—elasticsearch启动失败的几种情况及解决
- 从涂鸦到发布 —— 理解API的设计过程
- 【powerdesigner】将pdm或者cdm保存为普通图片格式
- 一部手机可以对多个开发者账号开启双重认证吗?
- nit计算机应用基础是考试大纲,NIT考试大纲--计算机应用基础.doc
- Docker初识与安装
- LIBUV学习笔记(三)libuv中pipe/tty相关操作以及一个简单的unix域回射服务器/客户端例子...
- JavaScript 丨 你不知道的arguments
- java 如何去掉http debug日志_Java高手如何搭建高效易用的日志系统
- fiddler抓包教程
- autosar 与osek 的nm
- 内存分配方式与内存分配算法
- 2018年12月份计算机,CPU天梯图2018年12月最新版 十二月台式电脑CPU性能排行
- 为什么越来越多的人选择FUP T10S系列超声波探伤仪
- 【附源码】计算机毕业设计java-志愿者管理系统设计与实现
- 玩转Linux操作系统常见操作,包括VMware安装,DHCP,DNS,Sendmail,NCSA验证,Apache,反向代理,webalizer,创建oracle用户,赋权,挂载
- 父爱动画代码python_情人节锦囊:简单的python表白程序(动画效果)
- iOS-利用粒子发射器(CAEmitterLayer) 制作发射动画
- HUAWEI交换机的Hybrid接口(混杂模式)详解与实验配置演示
- 使用.NET 将PDF转成Word
热门文章
- m1 Mac的brew包完全卸载方法
- python小工具(一)
- jdbctemplate 开启事务_浅入浅出 Spring 事务传播实现原理
- 无序数组求第k大的数 python_【python刷题】寻找数组中第K大/小的数
- php sql查看本月记录,SQL Server 获取本周,本月,本年等时间内记录
- .netcore excel导出回车换行_必须掌握的回车键Enter应用技巧,100%干货
- python中easygui和tkinter_python easygui Tkinter
- python安装成功的图标_安装Python
- php员工删除,php+mysql删除指定编号员工信息的方法_PHP
- android点击出现菜单,Android 点击按钮弹出菜单