您的位置:首页 > 其它

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

2017-02-03 12:28 375 查看
传送门 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
,s
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: