题目描述

给出一个类似这样

的图,求删掉最多的黑边使得每个特殊点和至少一个节点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. 定位网页元素、透明度、z-index、包裹性和破坏性

    一.定位 position属性————规定元素的定位类型,即元素脱离文档流的布局,在页面的任意位置显示 也可以参见以前的总结 <—— 戳 static:默认值,没有定位 relative:相对定 ...

  2. LeetCode.941-有效山形数组(Valid Mountain Array)

    这是悦乐书的第360次更新,第387篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第222题(顺位题号是941).给定一个整数数组A,当且仅当它是一个有效的山形数组时返回 ...

  3. SpringCloud解决了哪些问题?

    1.与分布式系统相关的复杂性 – 包括网络问题,延迟开销,带宽问题,安全问题. 2.处理服务发现的能力 – 服务发现允许集群中的进程和服务找到彼此并进行通信. 3.解决冗余问题 – 冗余问题经常发生在 ...

  4. JS 截取字符的方法

    substr() 方法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符. stringObject.substr(start,length) start:必需.要抽取的 ...

  5. MAS多媒体的整个存储架构是怎样的?

    MAS多媒体的整个存储架构是怎样的?

  6. CM金丝雀Canary报错

    参考: https://www.cnblogs.com/barneywill/p/10400788.html CM金丝雀Canary报错 1 HDFS 金丝雀Canary 测试无法为 /tmp/.cl ...

  7. spring boot-14.集成MyBatis

    1.如何使用注解版Mybatis? (1)引入mybatis ,druid,Mysql 的依赖,环境搭建可以参考第13篇的内容 <dependency> <groupId>or ...

  8. mongodb增删改查常用命令总结

    前言 去年我还折腾过mongodb,后来用不到也就没碰了,这就导致了我忘的一干二净,不得不感叹,编程这东西只要不用,就会忘没了.现在我想重拾mongodb,来总结一下常用命令,主要就是增删改查. 另外 ...

  9. 滑雪(dp或记忆化搜索)

    题意:给你一个二维数组,求最长的递减路线的长度,只能向四个方向延伸. 解法1.dp[i][j]以i.j结尾的最长路线长度.边界:每个数初值为1, 转移:从四周向i.j转移,if(a[i][j]> ...

  10. Android-Widget桌面小组件

    1, 掌握Widget的用:Widget的用途,能够添加到手机桌面的程序 2, Widget的特点和用法步骤: 特点:快捷,方便,个性化,可自定义功能,可及时控制更新Widget显示内容 3, 用法步 ...