题意:

给出一棵树,删除一条边再添加一条边,求新树的最短的直径。

分析:

因为n比较小(n ≤ 2500),所以可以枚举删除的边,分裂成两棵树,然后有这么一个结论:

合并两棵树后得到的新树的最短直径为:

这两棵树一定是这样合并的,分别取两棵树直径的中点,然后将其连接起来。这样新树的直径才是最短的。

所以在找直径的同时还要记录下路径,方便找到中点。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; const int maxn = + ; int n; struct Edge
{
int u, v, nxt;
bool del;
}; Edge edges[maxn * ];
int ecnt;
int head[maxn]; void AddEdge(int u, int v)
{
Edge& e = edges[ecnt];
e.u = u;
e.v = v;
e.nxt = head[u];
e.del = false;
head[u] = ecnt++;
} int pre[maxn];
int len, id;
void dfs(int u, int fa, int dep)
{
pre[u] = fa;
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 + );
}
} int mid; int diameter(int u)
{
id = u;
len = ;
dfs(u, , );
int s = id;
len = ;
dfs(s, , ); mid = id;
for(int i = ; i < len / ; i++) mid = pre[mid]; return len;
} int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
memset(head, -, sizeof(head));
ecnt = ; for(int u, v, i = ; i < n; i++)
{
scanf("%d%d", &u, &v);
AddEdge(u, v); AddEdge(v, u);
} int ans = ;
int del_u, del_v, add_u, add_v; for(int i = ; i < ecnt; i += )
{
Edge& e = edges[i];
edges[i].del = true;
edges[i^].del = true; int d1 = diameter(e.u), tu = mid;
int d2 = diameter(e.v), tv = mid;
int d3 = (d1 + ) / + (d2 + ) / + ; d1 = max(max(d1, d2), d3);
if(d1 < ans)
{
ans = d1;
del_u = edges[i].u;
del_v = edges[i].v;
add_u = tu;
add_v = tv;
} edges[i].del = false;
edges[i^].del = false;
} printf("%d\n%d %d\n%d %d\n", ans, del_u, del_v, add_u, add_v);
} return ;
}

代码君

UVa 11695 树的直径 Flight Planning的更多相关文章

  1. bzoj2237[NCPC2009]Flight Planning 结论题?

    2237: [NCPC2009]Flight Planning Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 55  Solved: 27[Submi ...

  2. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

  3. poj1985 Cow Marathon (求树的直径)

    Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 3195   Accepted: 1596 Case ...

  4. VIJOS1476旅游规划[树形DP 树的直径]

    描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...

  5. poj2631 树的直径

    设s-t是这棵树的直径,那么对于任意给予的一点,它能够到达的最远的点是s或者t. 这样我们可以通过2次bfs找到树的直径了. #include<cstdio> #include<qu ...

  6. 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1034  Solved: 562[Submit][St ...

  7. 牡丹江.2014B(图论,树的直径)

    B - Building Fire Stations Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%lld & ...

  8. 2227 邮票--FUoj(链接表+树的直径)

    http://acm.fzu.edu.cn/problem.php?pid=2227 我感觉这道题可以随意搞 题目大意: 给你的一个图就是一条链,但是不知道起始点和结束点,而且每个点只会访问一次. 因 ...

  9. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...

随机推荐

  1. Code First 2

    在codefirst一中也说了Mapping是实体与数据库的纽带,model通过Mapping映射到数据库,我们可以从数据库的角度来分析?首先是映射到数据库,这个是必须的.数据库里面一般包括表.列.约 ...

  2. linux系统基本结构-《循序渐进linux》

    1.linux控制台 linux系统由桌面控制台(X -Window视窗)和字符控制台组成.字符控制台是linux的核心,默认linux下有6个字符控制台. 字符控制台--〉X-Window下:ctr ...

  3. android studio项目提交Git@OSC

    转载地址:http://www.bubuko.com/infodetail-977061.html 先到git.oscchina.net网站上申请个账号,然后创建一个项目.过程不再说了. 新建工程后, ...

  4. -oN ,-oX,-oG

    -oN ,正常输出 -oX, xml输出 nmap  192.168.9.12 -oX TEST.xml -oG grep输出 html文件可读性比xml文件要好,将xml转换成html     xs ...

  5. Linux环境下mysql的root密码忘记解决方法(2种)

    方法一: 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以 ...

  6. jsp另外五大内置对象之response-操作cookie

    responseo3.jsp <%@ page language="java" contentType="text/html; charset=utf-8" ...

  7. UVA 624 CD(01背包,要记录路径)

    题意: 有n张CD(n<=20),每张能播放的时长不同.给定一个时长限制t,挑出部分的CD使得总播放时间最长.顺便输出路径! 思路: 重点在输出路径,否则这题很普通.那就要用二维数组记录每个CD ...

  8. Android(java)学习笔记106:Android设置文本颜色的4种方法

    1. Android设置文本颜色的4种方法: (1)利用系统自带的颜色类: tv.setTextColor(android.graphics.Color.RED); (2)数字颜色表示: tv.set ...

  9. python plt 保存jpg出错

    pip install pillow就可以解决

  10. USACO08FEB Hotel

    题目传送门 线段树维护区间 线段树结构体 struct zzz{ int l,r,mi; //l为以左端点的为起点的最长子串 //r为以右端点为终点的最长子串 //mi是区间内部的最长子串 }tree ...