您的位置:首页 > 其它

hdu 4714(树形dp)

2014-05-26 18:06 411 查看
题目链接: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: