bzoj 1907 树的路径覆盖 [贪心] [树的最小路径覆盖]

原创 2016年08月29日 21:01:32

这里写图片描述


这道题贪心DP都可以做,但是贪心的正确性容易证明,因为子树合并一定不会劣与合并,那么我就贪心了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<iomanip>
#include<ctime>
#include<climits>
#include<cctype>
#include<algorithm>
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
using namespace std;
#define smax(x,tmp) x=max((x),(tmp))
#define smin(x,tmp) x=min((x),(tmp))
#define maxx(x1,x2,x3) max(max(x1,x2),x3)
#define minn(x1,x2,x3) min(min(x1,x2),x3)
const int INF=0x3f3f3f3f;
const int maxn = 10005;
struct Edge
{
    int to,next;
}edge[maxn<<1];
int head[maxn];
int maxedge;
inline void addedge(int u,int v)
{
    edge[++maxedge] = (Edge) { v,head[u] };
    head[u] = maxedge;
    edge[++maxedge] = (Edge) { u,head[v] };
    head[v] = maxedge;
}
int n;
inline void init()
{
    scanf("%d",&n);
    memset(head,-1,sizeof(head));
    maxedge=-1;
    for(int i=1;i<n;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        addedge(u,v);
    }
}
int f[maxn];
bool flag[maxn];
void dfs(int u,int father)
{
    int cnt=0;
    f[u]=1;
    for(int i=head[u];~i;i=edge[i].next)
    {
        int v=edge[i].to;
        if(v==father) continue;
        dfs(v,u);
        f[u]+=f[v];
        if(!flag[v]) cnt++;
    }
    if(cnt>=2) f[u]-=2,flag[u]=true;
    else if(cnt==1) f[u]-=1;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
#endif
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        init();
        memset(flag,0,sizeof(flag));
        dfs((n+1)>>1,-1);
        printf("%d\n",f[(n+1)>>1]);
    }
    return 0;
}
版权声明:S'il vous plait.

相关文章推荐

bzoj2150部落战争 最小路径覆盖

http://www.lydsy.com/JudgeOnline/problem.php?id=2150 之前一直不会的二分图。 然后百度百科普及了一下有关最小路径覆盖的知识。 ...

BZOJ1907 树的路径覆盖

考虑树DP,DP每个子树内的最小路径覆盖,注意到一个点有两种状态,一种是有两个儿子与他在同一条路径里,另一种是没有两个儿子与他在同一条路径里,第一种情况这个点不能与他的父亲相连,而第二种可以,所以我们...

【bzoj1907】【树的路径覆盖】【贪心】

Description Input Output Sample Input 1 7 1 2 2 3 2 4 4 6 5 6 6 7 Sample O...

2017洛谷3月丧病月赛思考记录

简直难上天(对于蒟蒻的我) 第一题: 本来想着是先求出第一个,然后从1往后找规律,结果: 晃悠了2h怒弃,实在太凶残 这应该是数列题难度  的极限了 lim(难度→∞) 、、 、 唯一...

[树形DP || 贪心] BZOJ 1907 树的路径覆盖

DP #include #include #include #include #define cl(x) memset(x,0,sizeof(x)) using namespace std; in...

[BZOJ1907]树的路径覆盖(贪心||树形dp)

Being yourself is an honor, because nobody else can be you. 做自己是一种荣耀,因为没有任何人能成为你。...

【bzoj1907】树的路径覆盖

DescriptionInputOutput Sample Input171 22 32 44 65 66 7 Sample Output3 HINT ,注意此注释有误,第二种情况应该为{...
  • w_yqts
  • w_yqts
  • 2017年07月26日 19:00
  • 55

【BZOJ1907】树的路径覆盖

Description Input Output Sample Input 1 7 1 2 2 3 2 4 4 6 5 6 6 7 Sample Output 3...

BZOJ 1907 树的路径覆盖

题目描述 输入 输出 样例输入 1 7 1 2 2 3 2 4 4 6 5 6 6 7 样例输出 3 题解:比较裸的树形...

BZOJ1907: 树的路径覆盖 树形DP

1907: 树的路径覆盖 Time Limit: 5 Sec  Memory Limit: 259 MB Submit: 661  Solved: 299 [Submit][Status...
  • Oakley_
  • Oakley_
  • 2016年09月07日 08:16
  • 267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bzoj 1907 树的路径覆盖 [贪心] [树的最小路径覆盖]
举报原因:
原因补充:

(最多只允许输入30个字)