CodeForces 14D 树的直径 Two Paths
2015-08-14 20:10
267 查看
给出一棵树,找出两条不相交即没有公共点的路径,使得两个路径的长度的乘积最大。
思路:枚举树中的边,将该边去掉,分成两棵树,分别求出这两棵树的直径,乘起来维护一个最大值即可。
代码君
思路:枚举树中的边,将该边去掉,分成两棵树,分别求出这两棵树的直径,乘起来维护一个最大值即可。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 200 + 10; int n; struct Edge { int u, v, nxt; bool del; }; int ecnt; int head[maxn]; Edge edges[maxn * 2]; void AddEdge(int u, int v) { edges[ecnt].u = u; edges[ecnt].v = v; edges[ecnt].nxt = head[u]; edges[ecnt].del = false; head[u] = ecnt++; } int len, id; void dfs(int u, int fa, int dep) { if(dep > len) { len = dep; id = u; } for(int i = head[u]; ~i; i = edges[i].nxt) { if(edges[i].del) continue; int v = edges[i].v; if(v == fa) continue; dfs(v, u, dep + 1); } } int main() { memset(head, -1, sizeof(head)); scanf("%d", &n); for(int u, v, i = 1; i < n; i++) { scanf("%d%d", &u, &v); AddEdge(u, v); AddEdge(v, u); } int ans = 0; for(int i = 0; i < ecnt; i += 2) { int u = edges[i].u, v = edges[i].v; edges[i].del = true; edges[i^1].del = true; int t1, t2; id = u; len = 0; dfs(u, 0, 0); len = 0; dfs(id, 0, 0); t1 = len; id = v; len = 0; dfs(v, 0, 0); len = 0; dfs(id, 0, 0); t2 = len; ans = max(ans, t1 * t2); edges[i].del = false; edges[i^1].del = false; } printf("%d\n", ans); return 0; }
代码君
相关文章推荐
- Triangle LOVE(拓扑排序)
- 智渔课堂官方免费教程四十五 :Java算法之递归算法
- Reward HDU杭电2647【反向拓扑+队列】
- poj 3070 矩阵连乘简单题
- Docker安装应用程序(Centos6.5_x64)
- I学霸官方免费教程四十五 :Java算法之递归算法
- Triangle LOVE(拓扑排序)
- 树莓派用Python写几个简单程序4:socket的使用
- LCS 算法
- HDU 5378 Leader in Tree Land
- 蚂蜂窝特价 v4.4.0 官方安卓版
- Android 入门指引 从零基础学安卓怎么开始
- asp.net mvc dropdownlist
- iOS SDK详解之NSCoding协议
- Codeforces Gym 100379G Wythoff’s game with three piles 博弈
- hdu 4277 USACO ORZ(dfs+剪枝)
- hdu 5381 The sum of gcd 莫队 + DP
- Hdu 2015 Multi-University Training Contest8
- Hit 2255 Not Fibonacci
- URAL-1225 Flags