【BZOJ】2657: [Zjoi2012]旅游(journey)

来源:互联网 发布:红鸟棋牌游戏源码 编辑:程序博客网 时间:2024/05/16 06:05

传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=2657

Solution

读懂题意,然后想一下三角剖分,就知道这题是求树的直径
(不要问我为什么码风突变,又臭又长跑得还慢)
【心情很不好】

#include<stdio.h>#include<map>#define N 200005 using namespace std;int n,ans,dep[N],s[N],tot;struct pr{    int a,b;    void st()    {        if (b<a) swap(a,b);    }    friend bool operator < (pr a,pr b)    {        return a.a==b.a?a.b<b.b:a.a<b.a;    }};map<pr,int> M;struct edge{    int v,n;}e[N<<1];void push(int &a,int b){    if (!a)    {        a=b;        return;    }    e[++tot]=(edge){b,s[a]},s[a]=tot;    e[++tot]=(edge){a,s[b]},s[b]=tot;}void solve(int k,int f){    int mx=0,pm=0;    for (int i=s[k];i;i=e[i].n) if (e[i].v!=f)    {        solve(e[i].v,k);        if (dep[e[i].v]>mx) pm=mx,mx=dep[e[i].v];        else if (dep[e[i].v]>pm) pm=dep[e[i].v];    }    ans=max(ans,mx+pm+1);    dep[k]=mx+1;}int main(){    scanf("%d",&n);    for (int i=1,a,b,c;i<n-1;i++)    {        pr t;        scanf("%d%d%d",&a,&b,&c);        t=(pr){a,b};        t.st();        push(M[t],i);        t=(pr){b,c};        t.st();        push(M[t],i);        t=(pr){c,a};        t.st();        push(M[t],i);    }    solve(1,0);    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击