题目链接:http://poj.org/problem?id=2631

题意:给出一棵树的两边结点以及权重,就这条路上的最长路。

思路:求树的直径。

这里给出树的直径的证明:

  主要是利用了反证法:

  假设 s-t这条路径为树的直径,或者称为树上的最长路
  现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后再从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路
  证明:

     1.设u为s-t路径上的一点,结论显然成立,否则设搜到的最远点为T则   dis(u,T) >dis(u,s)     且  dis(u,T)>dis(u,t)   则最长路不是s-t了,与假设矛盾
     2.设u不为s-t路径上的点
        首先明确,假如u走到了s-t路径上的一点,那么接下来的路径肯定都在s-t上了,而且终点为s或t,在1中已经证明过了
        所以现在又有两种情况了:
          1:u走到了s-t路径上的某点,假设为X,最后肯定走到某个端点,假设是t ,则路径总长度为dis(u,X)+dis(X,t)
          2:u走到最远点的路径u-T与s-t无交点,则dis(u-T) >dis(u,X)+dis(X,t);显然,如果这个式子成立,
          则dis(u,T)+dis(s,X)+dis(u,X)>dis(s,X)+dis(X,t)=dis(s,t)最长路不是s-t矛盾 (见下图)
 
求树的直径用2次bfd和2次dfs都可以。
 
dfs代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const int maxn=1e5+;
const int INF=0x3f3f3f3f; struct Edge
{
int v,l;
int next;
} edge[maxn<<]; int vit[maxn],d[maxn];
int head[maxn],k;
int node,ans; void init()
{
k=;
memset(head,-,sizeof(head));
} void addedge(int u,int v,int l)
{
edge[k].v=v;
edge[k].l=l;
edge[k].next=head[u];
head[u]=k++; edge[k].v=u;
edge[k].l=l;
edge[k].next=head[v];
head[v]=k++;
} void dfs(int u,int t)
{
for(int i=head[u]; i!=-; i=edge[i].next)
{
int v=edge[i].v;
if(vit[v]==)
{
vit[v]=;
d[v]=t+edge[i].l;
if(d[v]>ans)
{
ans=d[v];
node=v;
}
dfs(v,d[v]);
}
}
} int main()
{
//freopen("in.txt","r",stdin);
init();
int l,r,len;
while(scanf("%d%d%d",&l,&r,&len)==)
{
addedge(l,r,len);
} memset(vit,,sizeof(vit));
vit[]=;
ans=;
dfs(,); memset(vit,,sizeof(vit));
vit[node]=;
ans=;
dfs(node,); printf("%d\n",ans); return ;
}

bfs代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
const int maxn=1e5+;
const int INF=0x3f3f3f3f; struct Edge
{
int v,l;
int next;
} edge[maxn<<]; int vit[maxn],d[maxn];
int head[maxn],k;
int node,ans; void init()
{
k=;
memset(head,-,sizeof(head));
} void addedge(int u,int v,int l)
{
edge[k].v=v;
edge[k].l=l;
edge[k].next=head[u];
head[u]=k++; edge[k].v=u;
edge[k].l=l;
edge[k].next=head[v];
head[v]=k++;
} void bfs(int p)
{
queue<int>q;
vit[p]=;
q.push(p);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u]; i!=-; i=edge[i].next)
{
int v=edge[i].v;
if(vit[v]==)
{
d[v]=d[u]+edge[i].l;
vit[v]=;
q.push(v);
if(d[v]>ans)
{
ans=d[v];
node=v;
}
}
}
}
} int main()
{
//freopen("in.txt","r",stdin);
init();
int l,r,len;
while(scanf("%d%d%d",&l,&r,&len)==)
{
addedge(l,r,len);
} memset(vit,,sizeof(vit));
memset(d,,sizeof(d));
ans=;
bfs(); memset(vit,,sizeof(vit));
d[node]=;
ans=;
bfs(node); printf("%d\n",ans); return ;
}

poj2631 求树的直径裸题的更多相关文章

  1. lightoj 1094 Farthest Nodes in a Tree 【树的直径 裸题】

    1094 - Farthest Nodes in a Tree PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...

  2. poj 2631 Roads in the North【树的直径裸题】

    Roads in the North Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2359   Accepted: 115 ...

  3. poj 1985 Cow Marathon【树的直径裸题】

    Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 4185   Accepted: 2118 Case ...

  4. POJ3107Godfather(求树的重心裸题)

    Last years Chicago was full of gangster fights and strange murders. The chief of the police got real ...

  5. LightOJ--1094-- Farthest Nodes in a Tree(树的直径裸题)

    Farthest Nodes in a Tree Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu S ...

  6. poj1985 / poj2631(树的直径)

    poj1985 Cow Marathon 树的直径裸题 树的直径的一般求法: 任意一点为起点,dfs/bfs找出与它最远的点$u$ 以$u$为起点,dfs/bfs找出与它最远的点$v$ 则$d(u,v ...

  7. [USACO2004][poj1985]Cow Marathon(2次bfs求树的直径)

    http://poj.org/problem?id=1985 题意:就是给你一颗树,求树的直径(即问哪两点之间的距离最长) 分析: 1.树形dp:只要考虑根节点和子节点的关系就可以了 2.两次bfs: ...

  8. UESTC 1591 An easy problem A【线段树点更新裸题】

    An easy problem A Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others ...

  9. 求树的直径+并查集(bfs,dfs都可以)hdu4514

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...

随机推荐

  1. animate对颜色设置不起作用

    今天了解了一下stop的使用方法,但是实例中加入color:red的时候,动画效果没有实现,具体实例如下: http://jsbin.com/fezaroyene/edit?html,js,outpu ...

  2. 要学Java,怎么高效地学习,怎么规划

    要学Java,怎么高效地学习,怎么规划?   题主是一个个例,99%的人(包括我自己)都没有题主这样的经历,也很难提出具有很强参考性的java学习建议.我倒是之前面试过一个跟题主有点类似的人,拿出来分 ...

  3. CentOS7下搭建邮件服务器(dovecot + postfix + SSL)

    CentOS   花了基本上两天的时间去配置CentOS7下的邮件服务器.其中艰辛太多了,一定得总结下. 本文的目的在于通过一系列配置,在CentOS 7下搭建dovecot + postfix + ...

  4. Canvas实例

    <!doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. GNURadio 使用问题

  6. oracle创建用户

    --首先用管理员的帐户登录(要有修改用户的权限)system,默认数据库orcl. CREATE USER lcs IDENTIFIED BY lcs default tablespace lics_ ...

  7. [Scala] 快学Scala A2L2

    集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快 ...

  8. 10款最好的 Bootstrap 3.0 免费主题和模板

    Twitter Bootstrap 框架已经广为人知,用于加快网站,应用程序或主题的界面开发,并被公认为是迄今对于Web开发的最有实质性帮助的工具之一.在此之前的,各种各样的界面库伴随着高昂的维护成本 ...

  9. 聊聊Azure的安全性

    本来没打算写这篇博文,毕竟感觉太理论化,不像做技术的人应该写的东西,但是作为一名售前,发现很多不了解Azure的客户,上来的第一个问题竟然就是Azure如何保证客户数据的安全性,我清楚记得我第一次被问 ...

  10. C和指针 第十二章 使用结构和指针

    链表是一种常用的数据结构,每个节点通过链或者指针链接在一起,程序通过间接指针访问链表中的节点. typedef struct Node { //指向下一个节点的指针 struct Node *next ...