题干
Input

Output

Example
Test 1:						Test 2:
3 5
1 2 1 2
2 3 1 3
1 4
3 5 3 10
Tips

译成人话

给n个结点,n-1条无向边。即一棵树。我们需要给这n-1条边赋上0~ n-2不重复的值。mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小非负整数。计算下面等式的最大值:

扯淡时间到:

看到题,头皮发麻,怎么想也想不出来,越是想越是觉得人是真的有极限的,于是,我不做人啦,老师!!

另外,我突然找到了一个很不错的视频题解???我大B站无所不有Σ(っ °Д °;)っ

咳~不玩梗了,关于这道题 ,我自己的确是没什么思路,所以,还是感谢郭军凯大佬刘畅大佬的题解,给我这个小蒟蒻指了条明路 :D

首先,我们来看下面这张图:



我们一眼就能看到u1u2这条权值为0的边把这一堆节点分成了左右两堆,那么,根据定义我们能知道,无论是左还是右,只要是同一堆中的节点相互到达,答案一定是0,因为边肯定不经过0嘛,而0又肯定是最小的权。而如果左右两堆中的节点互相到达,那么一定要经过u1u2边也就是0权边,所以它的答案最小是1(不确定,因为我们不知道剩下的边权是多少,但最小一定是1,因为自然数中除了0就是1最小,更多的2,3,4…也是以此类推)

那么下一步,我们肯定是要一个个赋边权,那么怎么赋呢?下一步我们要赋值边权1,能考虑的边有u1v1,u1v2,v1v3,u2v4,u2v5…太多了。那么,我们再看一张图:



如图,我把v1v3这条边赋值为1,那么u1到v1,u1到v2,答案显然都是1,因为路径没经过1这条边,只有v1到v3答案为2,因为经过了1权边。

那么,我把u1v1这条边赋为1呢?



我们会发现,u1到v1,v1到v3,现在都经过了边权为1的边,此时答案都变成了2,显然比原来更大了。据此,我们可以推断,边权1赋给与0权边相邻的边时,答案最大,即最优。当赋边权2,边权3…时也是同理。

那么现在的问题是,与0权边相邻的边有u1v1,u1v2,u2v4,u2v5,这么多,我们该选哪个呢?



我们定义如图数组,在添加边权1之前,对于所有节点,只要路径经过u1u2即0权边,那么答案一定是1,对总答案贡献为siz[u1]*siz[u2];而路径不经过0权边的,跟一开始提到的一样答案都是0,对总答案没有贡献。所以此时在没加1权边时,除开u1u2外,总答案为 siz[u1]*siz[u2];



还是这张图,我们让它变得更一般化一点,u1u2表示为已确定权值的一条边,节点u1可表示为fa[v5][v1],节点u2表示为fa[v1][v5]。

我们的下一步加权选择有u1v1,u1v2,u2v4,u2v5,这里我只拿u1v1,u2v5两条边举例,别的边也是一样的道理,反正都会枚举到的。

如果我把下一个边权加在u1v1上,增大的答案就是1*siz[v1][v5]*siz[v5][v1](我们默认是按自然数从小到大顺序加权,每次权值都差1,故系数是1),再加上原来的dis[v1][fa[v1][v5]];

同理,把下一个边权加在u2v5上,增大的答案也是1*siz[v1][v5]*siz[v5][v1],再加上原来的dis[v5][fa[v5][v1]];

增大的答案都是一样的,所以我们最终比较的是dis[v1][fa[v1][v5]]和dis[v5][fa[v5][v1]]的大小,我们要取较大的那一个。

然后这题的思路就结束了,我们的步骤就是先预处理出siz[ ]和fa[ ][ ],再枚举i,j按公式找到dis[i][j]的最大值(这里要递归来找,因为我们不能保证枚举的顺序正好满足dis也是从小到大的顺序,中间会有空档,所以要递归)

最后的最后,开long long已经是常规操作了吧。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const int maxn=3005;
int head[maxn],len=0,n;
int root;
ll dis[maxn][maxn],fa[maxn][maxn],siz[maxn][maxn];
//dis[i][j]表示把从i到j间的m条边赋值0~m-1能得到的最大值
//fa[i][j]表示以i为根时,j的父节点
//siz[i][j]表示以i为根时,j节点的子树大小
struct Edge{
int next,to;
}edge[maxn<<1];
void Add(int u,int v){
edge[++len].next=head[u];
edge[len].to=v;
head[u]=len;
}
void Init(int u,int pa){//预处理fa[i][j]和siz[i][j]
siz[root][u]=1;//每节点的初始子树规模都是1,因为它自己就是一个节点 for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==pa) continue;
fa[root][v]=u;//更新v的父节点
Init(v,u);//向子树方向递归
siz[root][u]+=siz[root][v];//更新子树规模:siz[父]+=siz[子]
}
}
long long Update(int u,int v){
if(u==v) return 0;//自己到自己肯定是0
if(dis[u][v]) return dis[u][v];//记忆化,减少重复计算
return (dis[u][v]=max(Update(u,fa[u][v]),Update(v,fa[v][u]))+siz[u][v]*siz[v][u]);//向下递归
}
int main(){
cin>>n;
int x,y;
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
Add(x,y),Add(y,x);
}
for(int i=1;i<=n;i++){
root=i;
Init(i,-1);
}
ll ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
ans=max(Update(i,j),ans);//递归寻找答案的最大值
}
cout<<ans<<endl;
return 0;
}

Xenon's Attack on the Gangs(树规)的更多相关文章

  1. Codeforces 1292C Xenon's Attack on the Gangs 题解

    题目 On another floor of the A.R.C. Markland-N, the young man Simon "Xenon" Jackson, takes a ...

  2. Xenon's Attack on the Gangs,题解

    题目: 题意: 有一个n个节点的树,边权为0-n-2,定义mex(a,b)表示除了ab路径上的自然数以外的最小的自然数,求如何分配边权使得所有的mex(a,b)之和最大. 分析: 看似有点乱,我们先不 ...

  3. CF1292C Xenon's Attack on the Gangs 题解

    传送门 题目描述 输入格式 输出格式 题意翻译 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~ n-2不重复的值.mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小 ...

  4. 【树形DP】CF 1293E Xenon's Attack on the Gangs

    题目大意 vjudge链接 给n个结点,n-1条无向边.即一棵树. 我们需要给这n-1条边赋上0~ n-2不重复的值. mex(u,v)表示从结点u到结点v经过的边权值中没有出现的最小非负整数. 计算 ...

  5. CF1292C Xenon's Attack on the Gangs

    题目链接:https://codeforces.com/problemset/problem/1292/C 题意 在一颗有n个节点的树上,给每个边赋值,所有的值都在\([0,n-2]\)内并且不重复, ...

  6. [HEOI2015]兔子与樱花 树规+贪心

    鬼能想到是个贪心.明明觉得是树规啊..又完美爆零.. 从叶子节点往上更新,能保证最优解(这块想了半天). 证明:当你的子树上有能删的点而你不删时,可能会对子树的根节点有利,最好的情况是使子树根节点由不 ...

  7. 【9.2校内测试】【开学祭】【exgcd】【树规(背包】【模拟】

    比较裸的$exgcd$的应用? $exgcd$可以算出在$x$和$y$分别是最小正整数时的解.注意在这里因为有$a(x+\frac{b}{d})+b(y-\frac{a}{d})=c$,$d=gcd( ...

  8. HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Problem Description Today is the 10th Annual of ...

  9. 选课 ( dp 树形dp 动态规划 树规)

    和某篇随笔重了?!!?!?!?!?!?不管了留着吧 题目: 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之 ...

随机推荐

  1. 使用macaca抓页面元素,执行命令后报安装失败处理Error: Command failed: ……pm install -r "/data/local/tmp/com.macaca.android.testing"

    最近换了小米手机做自动化测试,执行命令的时候报安装失败错误,错误如下 解决:设置小米允许USB安装就好了 pm install -r "/data/local/tmp/com.macaca. ...

  2. Shell中傻傻分不清楚的TOP3

    Shell中傻傻分不清楚的TOP3 发布文章 近来小姐姐又犯憨憨错误,问组内小伙伴export命令不会持久化环境变量吗?反正我是问出口了..然后小伙伴就甩给了我一个<The Linux Comm ...

  3. ESXI多网卡网络配置

    1.两台路由器接入不同网络: 2.一台4网口服务器,网口分别为:vmnic0.vmnic1.vmnic2.vmnic3 3.ESXI6.5服务器虚拟机系统 测试环境模拟: 路由1:192.168.0. ...

  4. JAVA第三次blog总结

    JAVA第三次blog总结 0.前言 这是我们在博客园上第三次写博客,也是本学期最后一次的JAVA学习大总结.现在我们的JAVA已经接近尾声了,对于编程思想和方法的改变依旧是难点,但是经过这一段时间的 ...

  5. kworkerds挖矿木马

    昨天一朋友的公司服务器中了挖矿病毒,一起帮忙查看并做下记录.   病毒信息 名称:kworkerds 目录:/tmp/ 关键点:文件 -i 属性   i :这个i可就很厉害了.它可以让一个文件“不能被 ...

  6. 使用Volo.Abp.MailKit发送邮件

    Volo.Abp.MailKit封装继承MailKit库,为Abp邮件发送提供了快捷实现. 邮箱配置 qq邮箱支持smtp功能,需要去申请开通.参考qq邮箱设置,最重要的是smtp发送邮件,qq邮箱对 ...

  7. vuex登录验证及保持登录状态

    不知道vuex的可以先看一下 vuex官方文档,这里就不赘述了. 实现思路:假设我们现在想要访问自己在博客园里写的博客,这时候服务器需要知道当前用户是谁,才能确定我们是否有访问权限并正确地返回我们需要 ...

  8. 使用navicat连接mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'

    使用navicat时,报错截图如下: 原因分析: mysql开启了DNS的反向解析功能,这样mysql对连接的客户端会进行DNS主机名查找. mysql处理客户端解析过程: 当mysql的client ...

  9. easypoi 读取 Excel 简单应用

    背景 在做接口测试的时候,经常会使用 Excel 来存储对应的接口信息和用例信息,为了方便程序的读取,引入easypoi 工具来读取 Excel 内容.easypoi 比起 poi 使用更加的方便,代 ...

  10. 一个简单的CSS登录页

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...