//36分

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll; #define setfire(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
#define fre(name) freopen(#name".txt","r",stdin);
#ifdef WIN32
#define LL "%lld"
#else
#define LL "%I64d"
#endif const int N=2e5+;
const int Z=;
int n,S1,S2,la,lb,s_cnt,b[N],stack[N],prev[N];char s[];bool vis[N];
struct edge{int u,v,next;ll w;}e[N<<];int tot=,head[N];
int dep[N],fa[N][];
ll ans,LEN,dis[N],dist[N];
bool mark[Z][Z];
struct data{int x,y;}state[N];
inline int read(){
int x=;char ch=getchar();
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x;
}
inline void add(int x,int y,int z){
e[++tot].u=x;e[tot].v=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
e[++tot].u=y;e[tot].v=x;e[tot].w=z;e[tot].next=head[y];head[y]=tot;
}
void BFS(int S){
int top=;
stack[top]=S;dep[S]=;fa[S][]=S;
while(top){
int x=stack[top--];
for(int i=head[x];i;i=e[i].next){
if(e[i].v!=fa[x][]){
fa[e[i].v][]=x;
dep[e[i].v]=dep[x]+;
dist[e[i].v]=dist[x]+e[i].w;
stack[++top]=e[i].v;
}
}
}
}
inline int bfs(int S){
memset(dis,-,sizeof dis);
memset(vis,,sizeof vis);
int id=,mx=-,top=;
stack[top]=S;dis[S]=;vis[S]=;
while(top){
int x=stack[top--];
for(int i=head[x];i;i=e[i].next){
if(!vis[e[i].v]&&dis[e[i].v]<dis[x]+e[i].w){
vis[e[i].v]=;
dis[e[i].v]=dis[x]+e[i].w;
if(dis[e[i].v]>mx) mx=dis[e[i].v],id=e[i].v;
stack[++top]=e[i].v;
}
}
}
return id;
}
void gosolve(int S,int T){
memset(vis,,sizeof vis);
int id=,mx=-,top=;
stack[top]=S;vis[S]=;
while(top){
int x=stack[top--];
for(int i=head[x];i;i=e[i].next){
if(!vis[e[i].v]){
vis[e[i].v]=;
prev[e[i].v]=i;
if(e[i].v==T){top=;break;}
stack[++top]=e[i].v;
}
}
}
for(int i=T;i!=S;i=e[prev[i]^].v) b[prev[i]>>]++;
}
int lca(int a,int b){
if(dep[a]<dep[b]) swap(a,b);
int t=dep[a]-dep[b];
for(int i=;i<=;i++){
if(t&(<<i)){
a=fa[a][i];
}
}
if(a==b) return a;
for(int i=;i>=;i--){
if(fa[a][i]!=fa[b][i]){
a=fa[a][i];
b=fa[b][i];
}
}
return fa[a][];
}
void init(){
n=read();
for(int i=,x,y,z;i<n;i++) x=read(),y=read(),z=read(),add(x,y,z);
}
void dp_tree_len(int x,int fa){
for(int i=head[x],y;i;i=e[i].next){
if((y=e[i].v)!=fa){
if((x==la&&y==lb)||(x==lb&&y==la)) continue;
dp_tree_len(y,x);
LEN=max(LEN,dis[x]+dis[y]+e[i].w);
dis[x]=max(dis[x],dis[y]+e[i].w);
}
}
}
void work(){
if(n<=){
BFS();
for(int i=,mx=;i<=n;i++) if(dist[i]>mx) mx=dist[i],S1=i;
S2=bfs(S1);
LEN=dis[S2];
printf("%I64d\n",LEN);
for(int j=;j<=;j++){
for(int i=;i<=n;i++){
fa[i][j]=fa[fa[i][j-]][j-];
}
}
ll lt;
for(int i=,anc;i<=n;i++){
for(int j=;j<i;j++){
if(mark[i][j]) continue;
anc=lca(i,j);
lt=dist[i]+dist[j]-dist[anc]*;
if(lt==LEN) mark[i][j]=,state[++s_cnt]=(data){i,j};
}
}
//直径条数
for(int i=;i<=s_cnt;i++){
gosolve(state[i].x,state[i].y);
}
int num=;
for(int i=;i<=n;i++) if(b[i]==s_cnt) num++;
printf("%d",num);
}
else{
dp_tree_len(,);
printf("%I64d\n",LEN);
}
}
int main(){
freopen("diameter.in","r",stdin);
freopen("diameter.out","w",stdout);
int size=<<;
char *p=(char*)malloc(size)+size;
__asm__("movl %0,%%esp\n"::"r"(p));
init();
work();
return ;
}

[Sdoi2013]直径(树的直径)的更多相关文章

  1. POJ 1985.Cow Marathon-树的直径-树的直径模板(BFS、DFS(vector存图)、DFS(前向星存图))

    Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 7536   Accepted: 3559 Case ...

  2. [SDOI2013]直径 (树的直径,贪心)

    题目链接 Solution 我们直接找到一条直径 \(s\),起点为 \(begin\),终点为 \(end\). 从前往后遍历点 \(u\) ,若子树中最大的距离与 \(dis(u,begin)\) ...

  3. 树形DP 学习笔记(树形DP、树的直径、树的重心)

    前言:寒假讲过树形DP,这次再复习一下. -------------- 基本的树形DP 实现形式 树形DP的主要实现形式是$dfs$.这是因为树的特殊结构决定的——只有确定了儿子,才能决定父亲.划分阶 ...

  4. SDOI2013直径(树的直径)

    题目描述: 点这里 题目大意: 就是在一个树上找其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. 题解: 首先,第一问很好求,两边dfs就行了,第一次从任一点找距它最远的点,再从这个点找距 ...

  5. BZOJ3124 [Sdoi2013]直径 【树的直径】

    题目 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一棵树上,任意两个节 ...

  6. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

  7. poj1985 Cow Marathon (求树的直径)

    Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 3195   Accepted: 1596 Case ...

  8. VIJOS1476旅游规划[树形DP 树的直径]

    描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...

  9. poj2631 树的直径

    设s-t是这棵树的直径,那么对于任意给予的一点,它能够到达的最远的点是s或者t. 这样我们可以通过2次bfs找到树的直径了. #include<cstdio> #include<qu ...

  10. 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1034  Solved: 562[Submit][St ...

随机推荐

  1. 【TCP/IP】IP路由选择

    IP层在内存中有一个路由表,当有数据要发送时.它要对该表进行一次搜索以确认转发地址.收到的数据到达IP层时,IP层会检查数据报的目的地址是否为本机IP或广播IP: 假设是.就依据IP首部协议字段的协议 ...

  2. zookeeper启动错误 ---- Unable to load database on disk

    zk启动报错 解决办法,进入zkdata目录删除version-2下面的所有文件 参考: https://issues.apache.org/jira/browse/ZOOKEEPER-1546 [h ...

  3. 分布式服务自增长唯一ID小结

    1.常用生成唯一ID的方式,例如UUID 2.生成唯一自自增长ID方式: 例如: Zookeeper的增加ID: redis的incr方法 mongodb的objectId 3.采用雪花模型 如下代码 ...

  4. Git的微操作

    合并分支代码,简单操作: 1.切换到master主干代码 2.到git repositories 视图,点击需要合并的分支,例如v1.1.9 点击merge 进行合并 3.然后push to Upst ...

  5. #淘宝#复制分享宝贝内容,打开淘宝APP,自己主动弹出宝贝提示信息

    场景描写叙述: 淘宝复制连接,分享出去,比方拷贝到QQ好友.微信好友,一个宝贝信息.然后你朋友长按复制你分享它了的这个宝贝.当然打开手机淘宝时.自己主动会跳出宝贝的信息,点击确定能够直接进入宝贝详情 ...

  6. Django——静态文件(如bootstrap)的配置

    静态文件如CSS, javascript(如bootstrap), 图片等文件在django中的配置官方文档写的比较模糊,自己通过实验验证后并整理如下,以防遗忘,目前只整理了关于本地开发中的设置方式, ...

  7. Oracle 隐式游标 存储过程

    --隐式游标 注意变量赋值用(:=) 连接符用(||)而不是加号(+) DECLARE v_pk T_PLAT_KEYWORD.ID%TYPE; --主键 v_amount_message T_PLA ...

  8. 微博,and java 多线程编程 入门到精通 将cpu 的那个 张振华

    http://down.51cto.com/data/2263476  java 多线程编程 入门到精通  将cpu 的那个 张振华 多个用户可以同时用一个 vhost,但是vhost之间是隔离的. ...

  9. src-resolve: 无法将名称 'extension' 解析为 'element declaration' 组件。

    activiti流程部署时,出现“src-resolve: 无法将名称 'extension' 解析为 'element declaration' 组件.”错误. 出错原因:项目所在路径中有中文.

  10. ASP.NET综合管理ERP系统100%源代码+所有开发文档

    该系统开发环境为:VS2010,数据库採用SQL Server,框架为ASP.NET. 源代码包含所有文档说明,代码简单易懂,凝视完整. 提示:假设没有安装水晶报表系统执行会报错,报表安装程序已经打包 ...