UVa 11695 树的直径 Flight Planning
题意:
给出一棵树,删除一条边再添加一条边,求新树的最短的直径。
分析:
因为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的更多相关文章
- bzoj2237[NCPC2009]Flight Planning 结论题?
2237: [NCPC2009]Flight Planning Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 55 Solved: 27[Submi ...
- poj2631 求树的直径裸题
题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...
- poj1985 Cow Marathon (求树的直径)
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 3195 Accepted: 1596 Case ...
- VIJOS1476旅游规划[树形DP 树的直径]
描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...
- poj2631 树的直径
设s-t是这棵树的直径,那么对于任意给予的一点,它能够到达的最远的点是s或者t. 这样我们可以通过2次bfs找到树的直径了. #include<cstdio> #include<qu ...
- 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)
1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1034 Solved: 562[Submit][St ...
- 牡丹江.2014B(图论,树的直径)
B - Building Fire Stations Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%lld & ...
- 2227 邮票--FUoj(链接表+树的直径)
http://acm.fzu.edu.cn/problem.php?pid=2227 我感觉这道题可以随意搞 题目大意: 给你的一个图就是一条链,但是不知道起始点和结束点,而且每个点只会访问一次. 因 ...
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...
随机推荐
- 小G搭积木
A小 G 搭积木文件名 输入文件 输出文件 时间限制 空间限制box.cpp box.in box.out 2s 128MB题目描述小 G 喜欢搭积木.小 G 一共有 n 块积木,并且积木只能竖着一块 ...
- 洛谷 P2983 [USACO10FEB]购买巧克力Chocolate Buying
购买巧克力Chocolate Buying 乍一看以为是背包,然后交了一个感觉没错的背包上去. #include <iostream> #include <cstdio> #i ...
- js基础的自定义属性练习
js基础的自定义属性练习: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type ...
- Linux生产服务器常规分区方案
常规分区方案 / 剩余硬盘大小 swap 100M /boot 100M DB及存储:有大量重要的数据 /data/ 剩余硬盘大小 / 50-200GB swap 1.5倍 /boot 100MB 门 ...
- 织梦DeDeCMS友情链接文字显示不全
文件:/include/taglib/flink.lib.php 把下面代码中的24改为合适的值 $attlist=”type|textall,row|24,titlelen|24,linktype| ...
- jsp另外五大内置对象之config
//配置web.xml <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi=&q ...
- python爬虫之路——对字符串的处理
对字符串的处理分类:分段,连接,剔除,提取,综合 连接:+,* +(加法)的使用 a='i' b=' love' c=' you' print(a+b+c) #return i love you *( ...
- 在Linux系统里安装Virtual Box的详细步骤
今天我试图在Linux 服务器上安装Kyma时,遇到如下错误消息: E1009 23:51:37.685891 358 start.go:174] Error starting host: Error ...
- idea中pom.xml没有工作 IDEA中maven项目pom.xml依赖不生效解决
问题: 今天在web项目中需要引入poi相关jar包.查看之下才发现pom.xml中的依赖虽然已经下载到了本地仓库 repository,但是却没有加入到项目路径的 Extenal Libraries ...
- JavaScript——图片懒加载
前言 有一个朋友问我这个问题,刚好有时间,现在就简单的写个Demo~ github | https://github.com/wangyang0210/bky/tree/picLoadLazy 内容 ...