HDU 4714 Tree2cycle
来源:互联网 发布:软件收入百强 编辑:程序博客网 时间:2024/05/22 03:11
题目链接
https://vjudge.net/problem/HDU-4714
题意
给一个图,定义环为有n个结点,n条边的图。在图中每删和每加一条边需要花费,求用最少的花费将图变成环。
思路
思路比较难想到:看了题解才知道的。
对于非根结点,假设其后代分支数为f,需要先将结点与其父亲断开,然后断开f-2个分支,将断开的分支再连成一条链,共需要花费1+2*(f-2),在加上与上一条链的链接,总共需要2+2*(f-2) = 2*(f-1)
根结点没有父亲同理需要2(f-2)花费
连成一条链后,需要首尾相连再花费1
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<string>#include<queue>#include<stack>#include<set>#include<map>#define ll long longusing namespace std;const int INF = ( 2e9 ) + 2;const ll maxn = 1e6+100;struct edge{ int v,Next;}e[maxn*2];int head[maxn];int tot,ans;bool mark[maxn];void add(int u,int v){ e[tot].v=v; e[tot].Next=head[u]; head[u]=tot++;}void init(){ memset(head,-1,sizeof(head)); tot=ans=0;}int dfs(int u,int fa){ int f=0; for(int i=head[u];i!=-1;i=e[i].Next) { int v=e[i].v; if(v==fa)continue; f+=dfs(v,u); } if(f>1) { if(fa==-1)ans=ans+f-2; else ans=ans+f-1; return 0; } else return 1;}int main(){ int T,n,u,v; scanf("%d",&T); while(T--) { init(); scanf("%d",&n); for(int i=0;i<n-1;i++) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs(1,-1); ans=ans*2+1; printf("%d\n",ans); }}
阅读全文
0 0
- HDU 4714 Tree2cycle
- hdu 4714 Tree2cycle dp
- hdu 4714 Tree2cycle
- HDU 4714 Tree2cycle
- hdu 4714 Tree2cycle
- hdu 4714 Tree2cycle
- Hdu 4714 Tree2cycle - DFS
- HDU 4714 Tree2cycle
- HDU 4714 Tree2Cycle
- HDU 4714 Tree2cycle
- HDU 4714 Tree2cycle
- HDU 4714 Tree2cycle 解题报告
- 树形dp-hdu-4714-Tree2cycle
- hdu 4714 Tree2cycle树上乱搞
- hdu 4714 Tree2cycle (树形dp)
- HDU 4714 Tree2cycle(树型DP)
- HDU 4714 Tree2cycle(树形dp)
- HDU 4714 Tree2cycle (构造,树形DP)
- 【NOIP2017提高A组集训10.25】吃草
- HTML
- 2016CCPC杭州站 C
- Python学习--定义函数及参数传值
- Java MyBatis(2)--- generatorConfig.xml详解与运行
- HDU 4714 Tree2cycle
- 活动——在活动使用Menu
- 51nod 1500 苹果曼和树 树形DP
- KNN入门练习
- 2. Servlet请求与响应(Request&&Response)
- 五子棋 电脑先走
- Al:从零开始的汇编语言2
- Pace 6 (1.写一个函数返回参数二进制中 1 的个数;2..获取一个数二进制序列中所有的偶数位和奇数位;3. 输出一个整数的每一位;4.两个int整数的二进制表达中,有多少个位不同
- 动态规划——编辑距离