zoukankan      html  css  js  c++  java
  • bzoj 1907: 树的路径覆盖【贪心+树形dp】

    我是在在做网络流最小路径覆盖的时候找到这道题的
    然后发现是个贪心+树形dp
    ( f[i] )表示在( i )为根的子树中最少有几条链,( v[i] ) 表示在( i )为根的子树中( i ) 是( 0)否(1)为一条链的端点
    然后贪心转移即可(有链端点则连起来)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N=10005;
    int T,n,h[N],cnt,f[N];
    bool v[N];
    struct qwe
    {
    	int ne,to,va;
    }e[N<<1];
    void add(int u,int v)
    {
    	cnt++;
    	e[cnt].ne=h[u];
    	e[cnt].to=v;
    	h[u]=cnt;
    }
    void dfs(int u,int fa)
    {
    	int con=0;
    	f[u]=1;
    	for(int i=h[u];i;i=e[i].ne)
    		if(e[i].to!=fa)
    		{
    			dfs(e[i].to,u);
    			f[u]+=f[e[i].to];
    			if(!v[e[i].to])
    				con++;
    		}
    	if(con==1)
    		f[u]--;//减掉本身
    	else if(con>1)
    		f[u]-=2,v[u]=1;//减掉本身和其中一个端点
    }
    int main()
    {
    	scanf("%d",&T);
    	while(T--)
    	{
    		memset(h,0,sizeof(h));
    		memset(e,0,sizeof(e));
    		memset(f,0,sizeof(f));
    		memset(v,0,sizeof(v));
    		cnt=0;
    		scanf("%d",&n);
    		for(int i=1;i<n;i++)
    		{
    			int u,v;
    			scanf("%d%d",&u,&v);
    			add(u,v);
    			add(v,u);
    		}
    		dfs(1,0);
    		printf("%d
    ",f[1]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Day10 python基础---函数进阶
    Day9 python基础---函数初识
    Day8 python基础
    Day7 python基础
    Day6 python基础
    Day5 python基础
    Day4 python基础
    Day3 python基础
    TensorFlow学习笔记5-概率与信息论
    TensorFlow学习笔记6-数值计算基础
  • 原文地址:https://www.cnblogs.com/lokiii/p/8185892.html
Copyright © 2011-2022 走看看