POJ 1985 Cow Marathon 树的直径

来源:互联网 发布:mac默认打开方式设置 编辑:程序博客网 时间:2024/06/05 11:06

链接:http://poj.org/problem?id=1985

题意:题目阐述不是很清楚,是一棵严格树,不存在环,求其中两点间距离最长一处。

思路:两点间距离最长即为树的直径。易得,从任意点开始DFS找到距离最长一点一定是距离最长两点之一,再从找到的点再DFS一次就可以找到数的直径。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<queue>#include<stack>#include<vector>#include<ctype.h>#include<algorithm>#include<string>#define PI acos(-1.0)#define maxn 50005#define maxm 100005#define INF 1<<25#define MAX 0x7ffffffftypedef long long ll;using namespace std;struct Edge{    int v,w;    int next;}edge[maxm];int tot,tt;int point[maxn];int vv[maxn],dis[maxn];int top=1,d;int init(){    top=1;    memset(edge,0,sizeof(edge));    memset(point,0,sizeof(point));    memset(vv,0,sizeof(vv));    memset(dis,0,sizeof(dis));    d=0;}int add_edge(int u,int v,int w){    edge[top].v=v;    edge[top].w=w;    edge[top].next=point[u];    point[u]=top++;    edge[top].v=u;    edge[top].w=w;    edge[top].next=point[v];    point[v]=top++;    return 0;}int dfs(int x){    vv[x]=1;    for(int i=point[x];i!=0;i=edge[i].next)    {        if(!vv[edge[i].v])        {            d+=edge[i].w;            dis[edge[i].v]=d;            dfs(edge[i].v);            d-=edge[i].w;        }    }}int main(){    scanf("%d%d",&tot,&tt);    init();    for(int i=0;i<tt;i++)    {        int x,y,z;        char ss[3];        scanf("%d%d%d%s",&x,&y,&z,ss);        add_edge(x,y,z);    }    dfs(1);    int aa=0,bb;    for(int i=1;i<=tot;i++)    {        if(dis[i]>aa)        {            bb=i;            aa=dis[i];        }    }    memset(dis,0,sizeof(dis));    memset(vv,0,sizeof(vv));    dfs(bb);    aa=0;    d=0;    for(int i=1;i<=tot;i++)    {        if(dis[i]>aa)        {            bb=i;            aa=dis[i];        }    }    printf("%d\n",aa);}


0 0
原创粉丝点击