HDU 4714 Tree2cycle

Tree2cycle

dfs

不是根节点:如果边数大于等于2,则删除与父节点的边。并且是一条环,那么每个点的度数是2,则还要删除num(每个节点儿子数)-2,只留两个儿子。当然删除边的儿子也要连到环上,又是一个num(每个节点儿子数)-2次操作。最后不同分支之间还要连一条边。所以复杂度为:2*(num-1)。

根:不用删父亲边和连分支边。2*(num-2)

注意本题要手动扩栈

 1 #pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<queue>
 7 #include<stack>
 8 #include<cmath>
 9 #include<algorithm>
10 #include<vector>
11 #include<malloc.h>
12 using namespace std;
13 #define clc(a,b) memset(a,b,sizeof(a))
14 #define inf 0x3f3f3f3f
15 const int N=10010;
16 #define LL long long
17 const double eps = 1e-5;
18 const double pi = acos(-1);
19 // inline int r(){
20 //     int x=0,f=1;char ch=getchar();
21 //     while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘) f=-1;ch=getchar();}
22 //     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
23 //     return x*f;
24 // }
25 vector<int>g[1000010];
26 int ans;
27 int vis[1000010];
28 int dfs(int u){
29     int num=0;
30     vis[u]=true;
31     for(int i=0;i<g[u].size();i++){
32         int v=g[u][i];
33         if(vis[v]==0){
34             num+=dfs(v);
35         }
36     }
37     if(num>=2){
38         if(u==1){
39             ans+=2*(num-2);
40         }
41         else
42             ans+=2*(num-1);
43         return 0;
44     }
45     else
46         return 1;
47 }
48 int main(){
49     // freopen("in.txt","r",stdin);
50     int T;
51     scanf("%d",&T);
52     while(T--){
53         ans=0;
54         int n;
55         clc(vis,0);
56         scanf("%d",&n);
57         for(int i=0;i<=n;i++) g[i].clear();
58         for(int i=0;i<n-1;i++){
59             int u,v;
60             scanf("%d%d",&u,&v);
61             g[u].push_back(v);
62             g[v].push_back(u);
63         }
64         int num=dfs(1);
65         printf("%d\n",++ans);
66     }
67     return 0;
68 }
时间: 2024-10-13 11:29:02

HDU 4714 Tree2cycle的相关文章

HDU 4714 Tree2cycle (树形DP)

题意:给定一棵树,断开一条边或者接上一条边都要花费 1,问你花费最少把这棵树就成一个环. 析:树形DP,想一想,要想把一棵树变成一个环,那么就要把一些枝枝叶叶都换掉,对于一个分叉是大于等于2的我们一定要把它从父结点上剪下来是最优的, 因为如果这样剪下来再粘上花费是2(先不管另一端),如果分别剪下来再拼起来,肯定是多花了,因为多了拼起来这一步,知道这,就好做了.先到叶子结点, 然后再回来计算到底要花多少. 代码如下: #pragma comment(linker, "/STACK:10240000

HDU 4714 Tree2cycle(树型DP)

解题思路: 将一棵树变成一个环.假设一个结点的分叉数目大于等于2.则将它与父节点断开.而且断开子结点数目sum - 2条边,并再次连接sum-2个儿子形成一条直链然后这条游离链与还有一条游离链相连,共须要2*(sum-1)个操作,假设该结点为根结点,则一共须要2 * (sum - 2)种操作. #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #includ

HDU 4714:Tree2cycle 树形DP

Tree2cycle 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4714 题意: 给出一棵树,可以删边和加边将这棵树变成一个圈(没有任何分支),求最少的操作次数. 题解: 将树改造为圈可以通过现将树变成一条没有分叉的链后再加上一条边连接链的两端. 再简化一下就变成了选一条路径作为主干,再将其他所有分叉通过增删边连接到竹竿上的过程. 设DP1[i](把以 i 为根节点的子树作为主干的一部分),和DP2[i](把以 i 为根节点的子树作为分叉),

HDOJ 题目4714 Tree2cycle(树形DP)

Tree2cycle Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 1730    Accepted Submission(s): 401 Problem Description A tree with N nodes and N-1 edges is given. To connect or disconnect one ed

hdu 4717 Tree2cycle(树形DP)

Tree2cycle Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total Submission(s): 2161    Accepted Submission(s): 508 Problem Description A tree with N nodes and N-1 edges is given. To connect or disconnect one edg

ACM总结——dp专辑(转)

感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ***********************

模拟2

    ID Origin Title 6 / 10 Problem A HDU 4706 Children's Day 7 / 22 Problem B HDU 4707 Pet 5 / 25 Problem C HDU 4708 Rotation Lock Puzzle 6 / 26 Problem D HDU 4709 Herding 1 / 9 Problem E HDU 4710 Balls Rearrangement     Problem F HDU 4711 Weather  

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

(转)dp动态规划分类详解

dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. ****************************************************************************************** 动态规划(英语:Dynamic programm