求树的直径【两遍BFS】

两遍BFS。从任意一个点出发,第一遍可以找到直径的一端,从这端出发即可找到另外一端。

证明:从U点出发,到达V【画个图便清晰了】

1.如果U在直径上,则V一定是直径的一个端点。

2.如果U不在直径上。U,V线一定和直径有交点(如果没有交点,从U引一条路到直径交于U‘。【反证】)。有交点则V一定是直径另一端。

代码:【举例】

int path(int x){ //从x出发,求直径
    mem(vis,-1);
    while(!Q.empty()) Q.pop();
    Q.push(x);
    vis[x]=0;
    while(!Q.empty()){
        int u=Q.front();    Q.pop();
        int L=G[u].size();
        rep(i,0,L-1){
            int v=G[u][i];
            if(g[u][v]==1 && vis[v]==-1){
                vis[v]=vis[u]+1;
                Q.push(v);
            }
        }
    }
    int ans=-1;
    int vv=-1;
    rep(i,1,n){
        if(vis[i]>ans){
            ans=vis[i];
            vv=i;
        }
    }
    while(!Q.empty()) Q.pop();
    mem(vis,-1);
    Q.push(vv);
    vis[vv]=0;
    while(!Q.empty()){
        int u=Q.front();    Q.pop();
        int L=G[u].size();
        rep(i,0,L-1){
            int v=G[u][i];
            if(g[u][v]==1 && vis[v]==-1){
                vis[v]=vis[u]+1;
                Q.push(v);
            }
        }
    }
    ans=-1;
    rep(i,1,n){
        if(vis[i]>ans){
            ans=vis[i];
        }
    }
    return ans;
}
时间: 2024-12-24 15:33:20

求树的直径【两遍BFS】的相关文章

Codeforces1294F. Three Paths on a Tree(两次BFS求树的直径)

题意: 给一棵树,找到三个顶点,使三个顶点两两之间路径的并集最大 思路: 必定会有一组最优解,使得 a,b是树直径上的端点. 证明: 假设某个答案取连接点x.x最远的树到达的点是s,根据树的直径算法,s是树的某个直径a的端点.假设x的最远和第二远的点组成的链是b,b就会和a有一段公共部分.我们取a和b相交部分距离s最远的那个点y.那么取这个链上点y的答案一定比x更优 用两次BFS可以求出直径的两个端点,在这个过程中还能顺便求出一个端点到树上每一点的距离.之后再用一次BFS求得另一个端点到树上每一

ural 1145 Rope in the Labyrinth 图中 bfs求树的直径

1145. Rope in the Labyrinth Time limit: 0.5 second Memory limit: 64 MB A labyrinth with rectangular form and size m × n is divided into square cells with sides' length 1 by lines that are parallel with the labyrinth's sides. Each cell of the grid is

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距离最远的两点的距离,有时也可以指最远的两点之间的路径. 至于树的直径怎么求,我们首先要知道一个结论,树上面随便取一点,离这一点最远的那个点一定是树的直径上面的两点中的一点 证明的博客:https://www.cnblogs.com/wuyiqi/archive/2012/04/08/2437424.

poj:1985:Cow Marathon(求树的直径)

Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5496   Accepted: 2685 Case Time Limit: 1000MS Description After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to get more exercise, so he has com

(求树的直径)Warm up -- HDU -- 4612

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 给一个无向图, 加上一条边后,求桥至少有几个: 那我们加的那条边的两个顶点u,v:一定是u,v之间含有桥的数量最多,然后uv之间的桥都没了,剩下的就是要求的结果: 树的直径的定义刚好就是两个节点之间含有最多的边: 下面是有关树的直径的知识: 这个题目需要手动扩展,不然会爆栈,而且手动扩展的话要用C++提交. 代码: #pragma comment(linker, "/STACK:1024000

poj2631 求树的直径裸题

题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s.t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路 证明: 1.设u为s-t路径上的一点,结论显然成立,否则设搜到的最远点为T则   dis(u

hdu 4514 湫湫系列故事――设计风景线(求树的直径)

随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好.  现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度.请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?  其中,可以兴建的路线均是双向的,他们之间的长度均大于0. Input 测试数据有多组,每组测试数据的第一行有两个数字n, m,其含义参见题目描述:  接下去m行,

求树的直径

树的直径是指树的最长简单路.求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径:              原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点              证明: 1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)                      2) 如果u不是直径上的点,则u到v必然

Warm up---hdu4612(求树的直径)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 给一个无向图, 加上一条边后,求桥至少有几个: 那我们加的那条边的两个顶点u,v:一定是u,v之间含有桥的数量最多,然后uv之间的桥都没了,剩下的就是要求的结果: 树的直径的定义刚好就是两个节点之间含有最多的边: 下面是有关树的直径的知识: 这个题目需要手动扩展,不然会爆栈,而且手动扩展的话要用C++提交. #pragma comment(linker, "/STACK:1024000000,