题目描述

给出一个类似这样

的图,求删掉最多的黑边使得每个特殊点和至少一个节点1连通

保证上下两棵树都存在一种dfs序使得访问特殊点的顺序为1~n

题解

设f[i][j]表示上面的树最后一个特殊点为i,j同理的最小选取数

每次加上lca-->max(i,j)+1的路径,由于题目保证了dfs顺序,所以不会出现不合法的情况

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std; int a[10001][2];
int ls[5001];
int fa[2][5001][11];
int d[2][5001];
int f[1001][1001];
int n,A,B,i,j,k,l,len,ans; void New(int x,int y)
{
++len;
a[len][0]=y;
a[len][1]=ls[x];
ls[x]=len;
} void dfs(int type,int t)
{
int i; fo(i,1,10)
fa[type][t][i]=fa[type][fa[type][t][i-1]][i-1]; if (t<=n) return; for (i=ls[t]; i; i=a[i][1])
{
fa[type][a[i][0]][0]=t;
d[type][a[i][0]]=d[type][t]+1; dfs(type,a[i][0]);
}
} void swap(int &x,int &y)
{
int z=x;
x=y;
y=z;
} int lca(int type,int x,int y)
{
int i; if (!x)
{
if (!type)
return n+1;
else
return n+A+1;
} if (d[type][x]<d[type][y]) swap(x,y); fd(i,10,0)
if (d[type][fa[type][x][i]]>=d[type][y])
x=fa[type][x][i]; fd(i,10,0)
if (fa[type][x][i]!=fa[type][y][i])
x=fa[type][x][i],y=fa[type][y][i]; if (x!=y)
x=fa[type][x][0]; return x;
} int main()
{
// freopen("f.in","r",stdin); scanf("%d",&n);
scanf("%d",&A);
fo(i,2,A)
{
scanf("%d",&j);
New(j+n,i+n);
}
fo(i,1,n)
{
scanf("%d",&j);
New(j+n,i);
}
scanf("%d",&B);
fo(i,2,B)
{
scanf("%d",&j);
New(j+n+A,i+n+A);
}
fo(i,1,n)
{
scanf("%d",&j);
New(j+n+A,i);
} d[0][n+1]=d[1][n+A+1]=1;
dfs(0,n+1);
dfs(1,n+A+1); memset(f,127,sizeof(f));
f[0][0]=0; fo(i,0,n-1)
{
fo(j,0,n-1)
{
k=max(i,j)+1; l=lca(0,i,k);
f[k][j]=min(f[k][j],f[i][j]+(d[0][k]-d[0][l]-1)); l=lca(1,j,k);
f[i][k]=min(f[i][k],f[i][j]+(d[1][k]-d[1][l]-1));
}
} ans=2133333333;
fo(i,0,n-1)
ans=min(ans,min(f[i][n],f[n][i])); printf("%d\n",(A-1)+(B-1)-ans);
}

CF1263F的更多相关文章

  1. CF1263F Economic Difficulties(DP)

    拿小号打了这场,然而做到这里时少看了条件,最后 10min 才发现,没有 AK,身败名裂-- 赛后看就是 sb 题-- (好像这题也不值 2500 吧?) 首先注意到一条很重要的条件:对于每棵树,都存 ...

随机推荐

  1. 如何在CBV中使用装饰器

    要区分函数装饰器和方法装饰器得区别 ,方法装饰器得第一个参数是self本身,所以函数装饰器不能用

  2. python的并发GIL 了解

    gil  又称 global interpreter lock (全局解释器锁) #python 中一个线程对应于c语言中的一个线程 #gil使得同一个时刻只有一个线程在一个cpu上执行字节码,无法将 ...

  3. css 命名 有的加# ,有的加点 ,有的没加。请问下都在什么情况下用的?

    [nav{}]这样的样式是给特定的标签直接定义样式时使用的,这个样式名称是跟标签是相对应的,比如我要给<p></p>这个标签设置样式,那我就可以直接写:p{样式}就可以,但是这 ...

  4. BUUOJ reverse 刮开有奖

    刮开有奖 这是一个赌博程序,快去赚钱吧!!!!!!!!!!!!!!!!!!!!!!!!!!!(在编辑框中的输入值,即为flag,提交即可) 注意:得到的 flag 请包上 flag{} 提交 拖到id ...

  5. mysql生成全局id(转)

    由于数据量以及IO效率的因素,很多项目对数据支持的数据库会采取分库分表的方式.使用了分库分表之后需要解决的一个问题就是主键的生成.多个表之间的主键就不能用数据库本身的自增主键来支持,因为不同表之间生成 ...

  6. Vue.js官方文档学习笔记(三)创建Vue实例

    创建Vue实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: var vm=new Vue({ //选项 }) Vue的设计受到了mvvm的启发 当创建一个 Vue 实 ...

  7. 解决PHP上传文件、下载文件中由于文件过大导致的上传失败及下载不全问题

    用php+apache上传文件的时候,由于文件过大,容易导致上传失败, 解决办法:修改php.ini中:upload_max_filesize  2m  即允许上传文件大小的最大值.默认为2M ,大小 ...

  8. hadoop-组件

    hadoop1.x 和 hadoop2.x 区别 HDFS 分布式文件存储系统 优点   缺点 MapReduce 分布式计算 详见我的博客 mapreduce YARN 计算资源管理器 主要了解两个 ...

  9. HNUST-1047 二叉树的表示

    1047: 二叉树的表示 时间限制: 1 Sec  内存限制: 128 MB提交: 4  解决: 4[提交][状态][讨论版] 题目描述 ​DJ非常痴迷于数据结构,二叉树是他最喜欢的结构模型.这种每个 ...

  10. vue城市选择组件

    适用于vue的城市选择组件 仓库地址 基本功能: 支持全选.反选以及全部清空. 支持按拼音筛选. 勾选省份将会勾选省份下所有城市. 返回数据可灵活处理. 安装 npm install cn-regio ...