【BZOJ】2657: [Zjoi2012]旅游(journey)
2017-02-03 12:28
375 查看
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=2657
Solution
读懂题意,然后想一下三角剖分,就知道这题是求树的直径
(不要问我为什么码风突变,又臭又长跑得还慢)
【心情很不好】
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; }
相关文章推荐
- BZOJ 2657 ZJOI2012 旅游(journey) 树形DP
- [BZOJ2657][Zjoi2012]旅游(journey)(dfs||树形dp)
- bzoj 2657: [Zjoi2012]旅游(journey) (map建图+树的直径)
- Bzoj2657 [Zjoi2012]旅游(journey)
- BZOJ 2657 [Zjoi2012] 旅游(journey)
- [bzoj 2657] [Zjoi2012]旅游(journey)
- [bzoj2657][Zjoi2012]旅游 journey_ 对偶图_树形dp
- [BZOJ2657][Zjoi2012]旅游(journey)(一些特殊的技巧+树的直径)
- BZOJ2657: [Zjoi2012]旅游(journey)
- 【BZOJ 2657】 [Zjoi2012]旅游(journey)
- [BZOJ 2657][Zjoi2012]旅游(journey):树的直径
- bzoj2657: [Zjoi2012]旅游(journey)
- BZOJ 2657 ZJOI 2012 旅游(journey) 树的直径
- BZOJ 2657 [Zjoi2012]旅游(journey)
- 【ZJOI2012】【BZOJ2657】旅游(journey)
- BZOJ 2657: [Zjoi2012]旅游(journey)
- BZOJ 2657 (ZJOI 2012 旅游) 求树上最长链(树的直径) MAP建树+BFS/DFS
- BZOJ2657:[ZJOI2012]旅游——题解
- 【ZJOI2012】bzoj2657 旅游
- [bzoj] 2657 ZJOI2012 旅游 || bfs