首页 > 代码库 > POJ 1985 Cow Marathon【树的直径】

POJ 1985 Cow Marathon【树的直径】

题目大意:给你一棵树,要你求树的直径的长度

思路:随便找个点bfs出最长的点,那个点一定是一条直径的起点,再从那个点BFS出最长点即可

以下研究了半天才敢交,1.这题的输入格式遵照poj1984,其实就是把后面的字母无视即可 2.这题数据量没给,所以把数组开得很大才敢交TUT

 

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <algorithm>

#include <queue>

#define maxn 120090

#define esp 0.00001

#define inf 0x3f3f3f3f

using namespace std;

int head[maxn],value[maxn],next[maxn],point[maxn];

int now=0,dist[maxn],x,y,v,ans;

void add(int x,int y,int v)

{

    next[++now]=head[x];

    head[x]=now;

    point[now]=y;

    value[now]=v;

}

int bfs(int s)

{

    queue<int>q;

    q.push(s);

    memset(dist,-1,sizeof(dist));

    dist[s]=0;

    int maxx=0,maxj=-1;

    while(!q.empty())

    {

        int u=q.front();

        q.pop();

        for(int i=head[u];i;i=next[i])

        {

            int k=point[i];

            if(dist[k]==-1)

            {

                dist[k]=dist[u]+value[i];

                if(dist[k]>maxx)

                {

                    maxx=dist[k];

                    maxj=k;

                }

                q.push(k);

            }

        }

    }

    ans=maxx;

    return maxj;

}

int main()

{

    int n,m;

    char ch[10];

    scanf("%d%d",&n,&m);

    for(int i=1;i<=m;i++)

    {

        scanf("%d%d%d%s",&x,&y,&v,ch);

        add(x,y,v);

        add(y,x,v);

    }

    int u=bfs(1);

    ans=0;

    bfs(u);

    printf("%d\n",ans);

    return 0;

}

POJ 1985 Cow Marathon【树的直径】