博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDOI2013 直径(树的直径必经边)
阅读量:4876 次
发布时间:2019-06-11

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

SDOI2013 直径

sol:

先求出任一直径同时把直径拎出来,树的非直径部分全部挂在直径上(如下)。

a

对于直径上的每一个点i,如果存在它到非直径上点的最大距离\(g[i]\)等于它到直径两端点中较短的那一段\(d[i]\)

则说明这一段也可以成为直径中的一部分。

而我们需要得到所有直径的交,画图可以发现假设两端(以中点为界)都存在上述的点,最逼近的两点间的边即为所求!

b

具体可以看代码实现。

code:

#include
#define IL inline#define RG register#define DB double#define LL long longusing namespace std;IL int gi() { RG int x=0,p=1; RG char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') p=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar(); return x*p;}const int N=2e5+3;LL mx,len,d[N],s[N],g[N];int n,l,r,S,T,cnt,tot,ans,f[N],fa[N],vis[N],head[N];struct EDGE{int next,to,v;}e[N<<1];IL void make(int x,int y,int z) { e[++tot]=(EDGE){head[x],y,z},head[x]=tot; e[++tot]=(EDGE){head[y],x,z},head[y]=tot;}void dfs(int x,int fx) { RG int i,y; for(i=head[x];i;i=e[i].next) if((y=e[i].to)!=fx) d[y]=d[x]+e[i].v,fa[y]=x,dfs(y,x);}void dfs2(int x,int fx,int RT) { RG int i,y; if(d[x]>g[RT]) g[RT]=d[x]; for(i=head[x];i;i=e[i].next) if((y=e[i].to)!=fx&&!vis[y]) d[y]=d[x]+e[i].v,dfs2(y,x,RT);}int main(){ RG int i,j,x,y,z; for(i=1,n=gi();i
mx) mx=d[i],S=i; mx=d[S]=0,fa[S]=0,dfs(S,0); for(i=1;i<=n;++i) if(d[i]>mx) mx=d[i],T=i; printf("%lld\n",len=mx); for(i=T;i;i=fa[i]) vis[i]=1,f[++cnt]=i,s[i]=d[i]; for(i=2;i
=s[f[j]];--j) if(s[f[j]]==g[f[j]]) r=j; printf("%d\n",ans=r-l); return 0;}//树的直径和直径必经边

转载于:https://www.cnblogs.com/Bhllx/p/11247456.html

你可能感兴趣的文章
C# 访问 C DLL
查看>>
Matlab与方程组
查看>>
NYOJ 477
查看>>
华为、科达、海康、大华等厂家摄像头通过非标方式(RTSP)接入流媒体服务实现WEB直播与录像...
查看>>
OSPF笔记
查看>>
PHP之abstract
查看>>
Rappid 消除试用版的弹出框
查看>>
精华 ionic入门之色彩、图标、边距和界面组件:列表
查看>>
顺变者昌
查看>>
Linux上vi(vim)编辑器使用教程
查看>>
promise intro2-用法
查看>>
极客范:如何使用 Cloud Insight 来监控闭路电视?
查看>>
Pytorch半精度浮点型网络训练问题
查看>>
Js操作Select大全
查看>>
java native method
查看>>
进入光云第一次做完项目的感受
查看>>
dns 视图
查看>>
[LeetCode] 合并K个排序链表
查看>>
leetcode--Balanced Binary Tree
查看>>
shell字符串处理
查看>>