题目链接:https://cn.vjudge.net/problem/UVALive-8072

题意

给出n+1个点和n条边,每对点之间只能存在一条边。

现在要找出一个节点,使得去掉这个点后,所剩每对不联通点的点对数最大。

还要在去掉这个点后加上一条边,使得加上这个边后,不联通点对数最小。

例:

6

0 1

1 2

2 3

2 4

4 5

4 6

答:11 5

思路

看不懂题意,更看不懂样例;只能临场猜题意,猜样例。

现在解释一下样例的意思。

首先画出这个无向图,然后找特殊节点。我帮你找到2这个节点是特殊点。

那么去掉节点2,现在有三个联通子图,分别是456-3-01。

再数缺失点对:4-3; 4-0; 4-1; 5-3;...,一共11对。

现在加上60这条边,缺失点对就是最小的5。(当然41也可以,实际上只要最大的两个联通图链接起来即可)

好的现在看懂题意了,显然发现原图是颗树。

而特殊节点就是树里边的某个节点。

去掉这个节点,可以使图分为子节点数+1个联通图。

缺失点对其实就是联通图点数分别乘当前的前缀和(当然,等于每个点数相乘,但是复杂度降低了)。

比如说样例的2节点,使原图分为3个联通图,点数为3,1,2。

那么缺失点对数计算如下:

31+(3+1)2=11

加一条边的最少缺失点对的计算,其实就是问哪两个联通图组合起来,有最少缺失点对。

很显然是最大的两个图组合起来(回忆初中二次函数问题,点数和等于n-1)。

这样我们首先树形dp算子树大小、计算缺失点对,最后查最大值,计算最小缺失点对即可。

整个复杂度可以到达O(n)。

提交过程

WA 少写个加号
AC

代码

#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e4+20;
vector<int> son[maxn];
int data[maxn], n, fat[maxn];
long long val[maxn];
int dp(int u, int fa){
fat[u]=fa;
if (data[u]>0) return data[u]; vector<int> pre, tmp;
data[u]=1;
for (int i=0; i<son[u].size(); i++) if (son[u][i]!=fa){
tmp.push_back(dp(son[u][i], u));
if (tmp.size()!=1) pre.push_back(pre.back()+tmp.back());
else pre.push_back(tmp.back()); data[u]+=tmp.back();
} int size=tmp.size();
if (size==0) val[u]=0;
else{
val[u]=pre[size-1]*(n-data[u]+1);
for (int i=1; i<size; i++)
val[u]+=pre[i-1]*tmp[i];
} return data[u];
} void solve(void){
long long mmax=0, idx=0;
for (int i=0; i<=n; i++) if (mmax<val[i]){
idx=i; mmax=val[i];
} int psize=0, tmp[maxn];
for (int i=0; i<son[idx].size(); i++) if (son[idx][i]!=fat[idx])
tmp[psize++]=dp(son[idx][i], idx);
tmp[psize++]=n+1-data[idx];
sort(tmp, tmp+psize);
tmp[psize-2]+=tmp[psize-1];
psize--; long long ans=0, pree=tmp[0];
for (int i=1; i<psize; i++){
ans+=pree*tmp[i];
pree+=tmp[i];
} printf("%lld %lld\n", mmax, ans);
} int main(void){
int a, b;
while (scanf("%d", &n)==1){
memset(data, -1, sizeof(data));
for (int i=0; i<=n; i++) son[i].clear();
for (int i=0; i<n; i++){
scanf("%d%d", &a, &b);
son[a].push_back(b);
son[b].push_back(a);
} dp(0, -1);
solve();
} return 0;
}
Time Memory Length Lang Submitted
33ms 1650 C++ 5.3.0 2018-08-23 04:16:14

UVALive-8072 Keeping On Track 树形dp 联通块之间缺失边的个数的更多相关文章

  1. 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

    题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...

  2. 联考day7 C. 树和森林 树形DP

    题目描述 样例 样例输入 8 5 BBWWWBBW 1 2 2 3 4 5 6 7 7 8 样例输出 84 2 1 4 样例解释 分析 首先,我们要预处理出一个点到该联通块内所有点的距离之和 \(f\ ...

  3. bzoj2200拓扑排序+最短路+联通块

    自己写的不知道哪里wa了,明明和网上的代码差不多.,. /* 给定一张图,有的边是无向边,有的是有向边,有向边不会出现在环中,且有可能是负权值 现在给定起点s,求出s到其余所有点的最短路长度 任何存在 ...

  4. 分别利用并查集,DFS和BFS方法求联通块的数量

    联通块是指给定n个点,输入a,b(1<=a,b<=n),然后将a,b连接,凡是连接在一起的所有数就是一个联通块: 题意:第一行输入n,m,分别表示有n个数,有输入m对连接点,以下将要输入m ...

  5. HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价

    Information Disturbing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/ ...

  6. hdu 2242双联通分量+树形dp

    /*先求出双联通缩点,然后进行树形dp*/ #include<stdio.h> #include<string.h> #include<math.h> #defin ...

  7. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)

    题目链接 D. Appleman and Tree time limit per test :2 seconds memory limit per test: 256 megabytes input ...

  8. HDU5739 Fantasia 树形dp + 点双缩点

    这个题当时打多校的时候有思路,但是代码能力差,没有写出来 事后看zimpha巨巨的题解,看了觉得基本差不多 核心思路:就是找出割点,然后变成森林,然后树形dp就可以搞了 关键就在重新构图上,缩完点以后 ...

  9. bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...

随机推荐

  1. iview datepicker 选择的时间少一天

    使用iview的datepicker时间选择器发现获取的value值是比实际要少一天,严格来说应该是时间格式不一样,datepicker获取的时间是UTC时间格式,也就是:yyyy-MM-ddTHH: ...

  2. 工作中常见的Git本地分支与远程分支同步场景

    Git 是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.   一直以来本人使用 Git 处理分支都是现用现查,一是因为怕出错,二还是因为懒,作为一名四年开发经验的前端 ...

  3. OSI层次介绍

    1.应用层:为应用软件提供接口,使应用程序能够使用网络服务. 2.表示层:①数据的解码和编码,②数据的加密和解密,③数据的压缩和解压缩. 3.会话层:建立.维护.管理应用程序之间的会话. 功能:对话控 ...

  4. ubuntu的LAMP环境搭建

    服务器的搭建,经典组合:LAMP(Linux+Apache+Mysql+PHP) unbuntu源更新:sudo apt update 更新:sudo apt upgrade 安装Apache:sud ...

  5. spring data JPA 中的多属性排序

    在此介绍我所用的一种方式: 第一步,引包 import org.springframework.data.domain.Sort;import org.springframework.data.dom ...

  6. Ajax发送XML请求案例

    Ajax发送XML请求需求: 根据输入的国家,输出这些国家下面的城市. 如果请求参数较多,而且请求参数的结构关系复杂,则可以考虑发送XML请求.XML请求的实质还是POST请求,只是在发送请求的客户端 ...

  7. BP网络中的反向传播

    本文的主要参考:How the backpropagation algorithm works 下面是BP网络的参数结构示意图 首先定义第l层网络第j个神经元的输出(activation) 为了表示简 ...

  8. http格式(graph)

    http请求格式 http请求头 字段 http响应 http响应头字段

  9. 腾讯云 ubuntuservermysql安装和外网訪问

    1 腾讯云 购买ubuntu 默认账户是ubuntu(因为winscp 使用ubuntu没有权限写文件) 因为腾讯云主机ubuntu系统默认username为ubuntu,不喜欢每次做什么都要sudo ...

  10. 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放具体解释

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行解说,主要通过MFC单文档视图实现显示BMP图片空间几何变换.包含图像平移.图形 ...