博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树形DP(统计直径的条数 HDU3534)
阅读量:5046 次
发布时间:2019-06-12

本文共 1313 字,大约阅读时间需要 4 分钟。

分析:首先树形dp(dfs计算出每个点为根节点的子树的最长距离和次长距离),然后找出L=dis[u][0]+dis[u][1]最长的那个点u,然后在以u为根节点dfs,统计长度为L的条数:具体做法:把u的儿子节点为根节点的子树深搜遍历到每个叶子节点,用h[dist[v]]统计该子树中u到v的距离,然后对于遍历过的叶子节点且不再当前子树中的s[L-dist[v]]的个数加到ans中,最后ans即为所求条数:

#pragma comment(linker, "/STACK:1024000000,1024000000")#include"stdio.h"#include"string.h"#include"stdlib.h"#include"queue"#include"algorithm"#include"string.h"#include"string"#include"math.h"#include"vector"#include"stack"#include"map"#define eps 1e-4#define inf 0x3f3f3f3f#define M 100009#define PI acos(-1.0)using namespace std;struct node{    int u,v,next;    __int64 w;}edge[M*2];int t,head[M],belong[M],dis[M][4],degree[M];int cnt;__int64 dist[M],a[M],L,ans;map<__int64,int>s,h;void init(){    t=0;    memset(head,-1,sizeof(head));}void add(int u,int v,int w){    edge[t].u=u;    edge[t].v=v;    edge[t].w=w;    edge[t].next=head[u];    head[u]=t++;}void dfs(int u,int f){    dis[u][0]=0;    dis[u][1]=0;    for(int i=head[u];~i;i=edge[i].next)    {        int v=edge[i].v;        if(v==f)continue;        dfs(v,u);        if(dis[u][0]
1) { dfs(i,-1); break; } } int id=1; L=dis[id][0]+dis[id][1]; for(i=2;i<=n;i++) { if(dis[id][0]+dis[id][1]

转载于:https://www.cnblogs.com/mypsq/p/4348107.html

你可能感兴趣的文章
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
用swing做一个简单的正则验证工具
查看>>
百度坐标(BD-09)、国测局坐标(火星坐标,GCJ-02)和WGS-84坐标互转
查看>>
pig自定义UDF
查看>>
输入名字显示其生日,没有则让输入生日,做记录
查看>>
爬虫综合大作业
查看>>
Kubernetes 运维学习笔记
查看>>
并查集 经典 畅通工程
查看>>
Spark MLlib 之 Naive Bayes
查看>>
php修改SESSION的有效生存时间
查看>>
spring security 11种过滤器介绍
查看>>
Hibernate一对多、多对一关联
查看>>
一、记录Git使用中遇到的问题及解决方法
查看>>
学习网址
查看>>
前端表格插件datatables
查看>>
内部类
查看>>
树链剖分入门
查看>>
图解算法时间复杂度
查看>>