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
",ans*2+1);
47     }
48     return 0;
49 }
View Code
原文地址:https://www.cnblogs.com/wally/p/3308819.html