hdu 4714(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714
思路:其实就是求树的分支数,然后就是分支数*2+1(要删边,加边变成直线最后在成环)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }