树的直径(51Nod-2602)

题目

一棵树的直径就是这棵树上存在的最长路径。现在有一棵n个节点的树,现在想知道这棵树的直径包含的边的个数是多少?

树的直径(51Nod-2602)_第1张图片

如图所示的数据,这棵树的直径为(1-2-3-6-9)这条路径,包含的边的个数为4,所以答案是4。

输入

第1行:一个整数n,表示树上的节点个数。(1<=n<=100000)
第2-n行:每行有两个整数u,v,表示u与v之间有一条路径。(1<=u,v<=n)

输出

输出一个整数,表示这棵树直径所包含的边的个数。

输入样例

10
1 2
2 3
3 4
3 5
3 6
3 7
3 10
6 8
6 9

输出样例

4

思路:树的直径模版题,由于输入无边权,因此将边权赋为 1 即可

源程序

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 500000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;

struct Edge{
    int w;
    int from,to;
    int next;
}edge[N];
int head[N],edgeNum=0;
int n,m;
int dis[N*2];
bool vis[N];
int start,endd;
void addEdge(int from,int to,int w) {
    edge[++edgeNum].to=to;
    edge[edgeNum].w=w;
    edge[edgeNum].next=head[from];
    edge[edgeNum].from=from;
    head[from]=edgeNum;
}
void dfs(int x) {
    vis[x]=true;
    for(int i=head[x];i!=-1;i=edge[i].next){
        int to=edge[i].to;
        if(!vis[to]) {
            dis[to]=dis[x]+edge[i].w;
            dfs(to);
        }
    }
}
int main()
{
    scanf("%d",&n);
    memset(head,-1,sizeof(head));
    edgeNum=0;

    m=n-1;
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        addEdge(x,y,1);
        addEdge(y,x,1);
    }

    memset(vis,false,sizeof(vis));
    memset(dis,INF,sizeof(dis));
    dis[1]=0;
    dfs(1);//从1号点开始找最远的点

    int maxx=-INF;
    for(int i=1;i<=n;i++){
        if(dis[i]>maxx&&dis[i]!=INF) {
            maxx=dis[i];
            start=i;//树的直径的起点
        }
    }

    memset(vis,false,sizeof(vis));
    memset(dis,INF,sizeof(dis));
    dis[start]=0;
    dfs(start);

    maxx=-INF;
    for(int i=1;i<=n;i++){
        if(dis[i]>maxx&&dis[i]!=INF) {
            maxx=dis[i];
            endd=i;//树的直径的终点
        }
    }

    printf("%d\n",maxx);
    return 0;
}

 

你可能感兴趣的:(#,51Nod,#,树形结构——树与二叉树)