UVA 11695 Flight Planning 修改一条边使得树的直径最短
来源:互联网 发布:淘宝运营费用 编辑:程序博客网 时间:2024/06/03 01:16
题目链接:点击打开链接
题意:
给定n(n<=2500) 节点的一棵树
删除一条边再加入一条边使得树的直径最短。
思路:首先枚举删除的那条边,
然后计算出删除后的2棵子树各自的重心
则新建的边一定是重心的连线。
而新的直径要么是在某个子树中,要么是两个子树间。
#include <cstdio>#include <algorithm>#include <string.h>#include <queue>#include <cstring>#include <cmath>#include <iostream>#include <vector>using namespace std;#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;#define pb push_backconst double inf = 1e9;const int N = 2505;struct Ans{int ans, oldx, oldy, nowx, nowy;};vector<int>edge[N];void add(int u, int v){edge[u].push_back(v);}int n;void init(){ for (int i = 0; i <= n; i++)edge[i].clear(); }Ans a;int dis[N], pre[N], far, badu, badv;vector<int>G;void bfs(int x){for (int i = 1; i <= n; i++)dis[i] = -1;pre[x] = -1;dis[x] = 0;queue<int>q;q.push(x);far = x;while (!q.empty()){int u = q.front(); q.pop();for (int i = 0; i < edge[u].size(); i++){int v = edge[u][i];if (dis[v] != -1 || (min(u, v) == min(badu, badv) && max(u, v) == max(badu, badv)))continue;dis[v] = dis[u] + 1;pre[v] = u;q.push(v); if (dis[far] < dis[v])far = v;}}G.clear();int tmp = far;while (tmp != -1){G.pb(tmp); tmp = pre[tmp];}}void work(){Ans d = {0, badu, badv, 0, 0 };int link = 1;bfs(badu);bfs(far);link += (dis[far] + 1) / 2;d.nowx = G[G.size() / 2];d.ans = dis[far];bfs(badv);bfs(far);d.nowy = G[G.size() / 2];link += (dis[far] + 1) / 2;d.ans = max(d.ans, dis[far]);d.ans = max(d.ans, link);if (d.ans < a.ans)a = d;}int l[N], r[N];void input(){scanf("%d", &n);init();for (int i = 1, u, v; i < n; i++){scanf("%d %d", &u, &v);add(u, v); add(v, u);l[i] = u; r[i] = v;}a.ans = inf;}int main(){int T; scanf("%d", &T);while (T--){input();for (int i = 1; i < n; i++){badu = l[i]; badv = r[i];work();}printf("%d\n%d %d\n%d %d\n", a.ans, a.oldx, a.oldy, a.nowx, a.nowy);}return 0;}/*241 22 33 4141 21 82 32 48 98 108 114 54 64 710 1210 1313 14*/
0 0
- UVA 11695 Flight Planning 修改一条边使得树的直径最短
- Uva 11248 求只修改一条边的流量使得最大流>c 的所有可行边
- 为什么平分圆面积的所有曲线中以直径最短?
- 对字符串HELL0_HULU中的字符进行二进制编码,使得字符串的编码长度尽可能短,最短长度为?
- uva 10803(最短路径)
- Uva 11090 最短路径
- uva 567(最短路径)
- uva 10048(最短路径)
- uva 10099(最短路径)
- uva 10801(最短路径)
- uva 10986(最短路径)
- uva 558(最短路径)
- uva 10985(最短路径)
- uva 10269(最短路径)
- UVa 10308 Roads in the North 树的直径
- uva 1416 Warfare And Logistics (最短路径树)
- hdu3790 - 最短路径问题 (Dijkstra)(多条最短路径找花费最少的一条)
- uva 1537 - Picnic Planning(生成树)
- (hdu step 1.3.6)Wooden Sticks(求长度和重量都严格递增的数列的个数)
- DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
- 完整的可按年份和月份查询数据并显示
- Spring MVC 表单控制器实现验证用户登录验证
- POJ 2458 Highways
- UVA 11695 Flight Planning 修改一条边使得树的直径最短
- python第四天
- HDU 1671 Phone List(字典树)
- SpringMVC Controller介绍(重点阅读)
- cactus的使用
- FZU 1977 Pandora adventure (插头dp)
- javascript数组的几个常用方法
- 关于初学Java的一些注意要点(一)
- 《第2章:线程安全性》一种常见的加锁约定