博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4717 Tree2cycle(树形DP)
阅读量:7132 次
发布时间:2019-06-28

本文共 2273 字,大约阅读时间需要 7 分钟。

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 edge, we need 1 unit of cost respectively. The nodes are labeled from 1 to N. Your job is to transform the tree to a cycle(without superfluous edges) using minimal cost.
A cycle of n nodes is defined as follows: (1)a graph with n nodes and n edges (2)the degree of every node is 2 (3) each node can reach every other node with these N edges.
 

 

Input
The first line contains the number of test cases T( T<=10 ). Following lines are the scenarios of each test case.
In the first line of each test case, there is a single integer N( 3<=N<=1000000 ) - the number of nodes in the tree. The following N-1 lines describe the N-1 edges of the tree. Each line has a pair of integer U, V ( 1<=U,V<=N ), describing a bidirectional edge (U, V).
 

 

Output
For each test case, please output one integer representing minimal cost to transform the tree to a cycle.
 

 

Sample Input
1 4 1 2 2 3 2 4
 

 

Sample Output
3
Hint
In the sample above, you can disconnect (2,4) and then connect (1, 4) and (3, 4), and the total cost is 3.
 

 

Source
 

 

Recommend
liuyiding   |   We have carefully selected several similar problems for you:            
 
/*每个节点如果有两个或两个以上结点,就将它先于父节点断开,然后在与子节点断开,全部断开之后,和子节点自称一条直链,最后将所有的子链连城一条直线一个结点有sum个子结点,断开是需要sum-2次操作,连接时需要sum-2次操作,这样一个结点就会进行2*(sum-2)次操作,这时加上断开父节点,一共进行了2*(sum-2)+1次操作,构成直链之后还需要和父节点连接,这样就一共是2*(sum-1)次操作,如果这个结点是刚开始的结点,那么就不用考虑父节点,这样操操作就是2*(sum-2)次*/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define N 1000009using namespace std;int t,n;vector
edge[N];int ans=0;bool dfs(int u,int p)//返回你搜到的是不是u的子树{ //cout<<"ans="<
<
=2) { if(u==1) ans+=2*(sum-2); else ans+=2*(sum-1); return false; } return true;}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&t); while(t--) { scanf("%d",&n); ans=0; int from,to; for(int i=0;i<=n;i++) edge[i].clear(); for(int i=0;i

 

转载于:https://www.cnblogs.com/wuwangchuxin0924/p/5795902.html

你可能感兴趣的文章
探究Android View 绘制流程,Canvas 的由来
查看>>
JS原生交互
查看>>
[译] JavaScript 工作原理:Web Worker 的内部构造以及 5 种你应当使用它的场景
查看>>
Android使用Path仿支付宝支付成功失败动画
查看>>
聊聊rocketmq的DailyRollingFileAppender
查看>>
HTTP/2
查看>>
[单刷APUE系列]第十七章——高级进程间通信
查看>>
分布式之消息队列的特点、选型、及应用场景详解
查看>>
多迪学员问到最多的问题:为什么要学习Python编程语言?
查看>>
从vue中学习defineProperty
查看>>
漂亮的颜色
查看>>
Android Volley 源码解析(二),探究缓存机制
查看>>
Go源码剖析:内置类型
查看>>
102. Binary Tree Level Order Traversal
查看>>
SAP云平台对Kubernetes的支持
查看>>
原来实现GCP用客户端登录这么简单啊
查看>>
PAT A1057 分块思想
查看>>
PAT A1007 动态规划
查看>>
VUE父子组件传递数据
查看>>
前端知识点——图片
查看>>