P1272 重建道路

题目描述

一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场。由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的。因此,牧场运输系统可以被构建成一棵树。John想要知道另一次地震会造成多严重的破坏。有些道路一旦被毁坏,就会使一棵含有P(1≤P≤N)个牲口棚的子树和剩余的牲口棚分离,John想知道这些道路的最小数目。

输入输出格式

输入格式:

第1行:2个整数,N和P

第2..N行:每行2个整数I和J,表示节点I是节点J的父节点。

输出格式:

单独一行,包含一旦被破坏将分离出恰含P个节点的子树的道路的最小数目。

输入输出样例

输入样例#1:

11 6
1 2
1 3
1 4
1 5
2 6
2 7
2 8
4 9
4 10
4 11
输出样例#1:

2

说明

【样例解释】

如果道路1-4和1-5被破坏,含有节点(1,2,3,6,7,8)的子树将被分离出来

#include<iostream>
#include<cstdio>
#include<cstring> #define N 151 using namespace std;
int n,m,ans,cnt,flag,w;
int head[N],son[N],vis[N];
struct node
{
int u,v,next;
}e[N<<]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].next=head[u];head[u]=cnt;
} void dfs2(int u,int tot)
{
if(son[u]==m)
{
w=tot;
return;
}
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;if(vis[i])continue;
if(son[u]-son[v]>=m)
{
vis[i]=;
son[u]-=son[v];
tot=tot+;
dfs2(u+-,tot);
vis[i]=;
}
}
} void dfs(int u)
{
if(flag) return;
for(int i=head[u];i;i=e[i].next)
{
dfs(e[i].v);
if(son[u]<m) continue;
else if(son[u]==m)
{
printf("1\n");
flag=;return;
}
else
{
int tmp=son[u];
dfs2(u,);
ans=min(ans,w);
son[u]=tmp;
}
}
if(flag) return;
} void dfs1(int u)
{
son[u]=;
for(int i=head[u];i;i=e[i].next)
{
dfs1(e[i].v);
son[u]+=son[e[i].v];
}
} int main()
{
int x,y;
n=read();m=read();
if(m==)
{
printf("1\n");
return ;
}
for(int i=;i<n;i++)
{
x=read();y=read();
add(x,y);
}
ans=0x3f3f3f3f;dfs1();
dfs();
if(!flag) printf("%d\n",ans);
return ;
}

42分错误暴力

/*
显然树形dp
dp[i][j]:i为根断掉子树大小为j最小边数
初始化dp[u][1]=1的度数
转移时枚举当前点断掉多少,算出连到的儿子断掉多少
因为由儿子转移过来,他们之间的连边不能断
但是转移时断掉了两次,所以答案减2
*/ #include<iostream>
#include<cstdio>
#include<cstring> #define N 151
#define inf 0x7f7f7f7f using namespace std;
int dp[N][N],head[N],d[N];
int n,m,ans,cnt;
struct node
{
int u,v,next;
}e[N<<]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].next=head[u];head[u]=cnt;
} void dfs(int u,int fa)
{
dp[u][]=d[u];
for(int i=head[u];i;i=e[i].next)
{
if(e[i].v!=fa)
{
dfs(e[i].v,u);
for(int j=m;j>=;j--)
for(int k=;k<=j;k++)
dp[u][j]=min(dp[u][j],dp[e[i].v][k]+dp[u][j-k]-);
}
}ans=min(ans,dp[u][m]);
} int main()
{
int x,y;
memset(dp,,sizeof dp);
n=read();m=read();
for(int i=;i<n;i++)
{
x=read();y=read();
add(x,y);add(y,x);
d[x]++;d[y]++;
}
ans=inf;
dfs(,);
printf("%d\n",ans);
return ;
}

P1272 重建道路(树形dp)的更多相关文章

  1. 洛谷 P1272 重建道路(树形DP)

    P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...

  2. Luogu P1272 重建道路 树形DP

    刚才瞅了半天自己当初写的,终于瞅出来了...QWQ 设f[i][j]表示以i为根的子树,包含j个节点所需砍掉的最小边数 那么可知f[u][1]=u的度: 方程:f[u][j]=min(f[u][j], ...

  3. 重建道路 树形DP

    重建道路 树形DP 给一棵树,问最少断多少边使得这棵树树最终只有\(p​\)个节点 设计dp状态\(f[u][i][j]\)表示节点\(u\),到第\(i\)个儿子,使\(j\)个节点分离,但是不分离 ...

  4. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  5. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 434  Solved: 170[Submit][Status][Discuss ...

  6. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...

  7. (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列

    Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...

  8. 洛谷 P1272 重建道路

    题目链接 题解 树形dp \(f_{i, j}\)表示以\(i\)为根的子树切出联通块大小为\(j\)的最小答案 显然\(f[i][1]\)为与\(i\)连的边数 设\(v\)是\(u\)的儿子 那么 ...

  9. [LUOGU1272] 重建道路 - 树形背包

    题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系 ...

随机推荐

  1. Manacher算法(马拉车算法)浅谈

    什么是Manacher算法? 转载自百度百科 Manachar算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍 ...

  2. centos7修改时间和时区

    设置时区同样, 在 CentOS 7 中, 引入了一个叫 timedatectl 的设置设置程序. 用法很简单: # timedatectl # 查看系统时间方面的各种状态 Local time: 四 ...

  3. kata练习题

    This time no story, no theory. The examples below show you how to write function accum: Examples: ac ...

  4. Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)--------hadoop环境的搭建

    Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)------https://blog.csdn.net/pucao_cug/article/details/71698903 ...

  5. zoj 3812 状压dp

    转载:http://blog.csdn.net/qian99/article/details/39138329 题意:给出n个物品,每个物品有两种属性Wi,Ti,有q组查询,每组查询要求在n个物品中选 ...

  6. FFT模板(From MG)

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; struct c ...

  7. Eddy's mistakes

    Problem Description Eddy usually writes  articles ,but he likes mixing the English letter uses, for ...

  8. Keywords Search AC自动机

    In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey al ...

  9. MyBatis3-以接口方式编程

    以下内容引用自http://www.yihaomen.com/article/java/304.htm,不过内容有修改: 继前一篇文章http://www.cnblogs.com/EasonJim/p ...

  10. [JavaEE] Testing the Java EE Application : Basic Arquillian integration test

    We have model like this: package com.pluralsight.bookstore.model; import javax.persistence.*; import ...