hdu 4714(树形dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714

思路:其实就是求树的分支数,然后就是分支数*2+1(要删边,加边变成直线最后在成环)。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 #define MAXN 1000100
 8 #pragma comment(linker, "/STACK:1024000000,1024000000")
 9 
10 int n,ans;
11 vector<vector<int> >G;
12 
13 int dfs(int u,int father)
14 {
15     int tmp=0; //计算分支数,大于等于2时有分支。
16     for(int i=0;i<G[u].size();i++){
17         int v=G[u][i];
18         if(v==father)continue;
19         tmp+=dfs(v,u);
20     }
21     if(tmp>=2){
22         if(u==1){  //如果是根节点的话,那么其有两条边在同一分支上。
23             ans+=tmp-2;
24         }else 
25             ans+=tmp-1;//否则就是只能选择一条边在一个分支上
26         return 0;
27     }else 
28         return 1;
29 }
30 
31 int main()
32 {
33     int _case,u,v;
34     scanf("%d",&_case);
35     while(_case--){
36         scanf("%d",&n);
37         G.clear();
38         G.resize(n+2);
39         for(int i=1;i<n;i++){
40             scanf("%d%d",&u,&v);
41             G[u].push_back(v);
42             G[v].push_back(u);
43         }
44         ans=0;
45         dfs(1,-1);
46         printf("%d\n",ans*2+1);
47     }
48     return 0;
49 }
View Code

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值