HDU 4714
来源:互联网 发布:linux 系统启动脚本 编辑:程序博客网 时间:2024/06/08 18:40
题的意思是说他本来给你一棵树然后你删掉或者加上一条边的花费都是1.问你最小花费数让它变成一个环。
出处是HDU 4714
思路其实挺简单的。
一直搜搜到底。然后回溯的时候的当前节点度数>2(如果是成环的话肯定就是2或者小于2)就把它和父节点之间的边砍掉。很强的一个地方也是一开始卡住的地方就是因为是回溯回来的。所以它下面的所有应该都是散的链。反正不成环。又因为对于一个点来说移动它的耗费一定是2.砍掉和再连上嘛。每次砍的时候*2就好了。至于父节点的标记数组为什么要-1.因为你在处理子节点的时候已经处理过了呀。相当于父节点可以少考虑一个节点了。
#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;const int siz=1000000+10;int book[siz];vector<int>h[siz];int ans=0;void dfs(int son,int father){ for(int i=0;i<h[son].size();i++){ int newson=h[son][i]; if(newson==father) continue; dfs(newson,son); if(book[newson]>2){ book[son]--; ans+=(book[newson]-2)*2; } }}int main(){ int T; freopen("2.txt","r",stdin); freopen("2.out","w",stdout); scanf("%d",&T); while(T--){ int N; ans=0; memset(book,0,sizeof(book)); scanf("%d",&N); for(int i=1;i<=N;i++){ h[i].clear(); } int a,b; for(int i=0;i<N-1;i++){ scanf("%d%d",&a,&b); book[b]++; book[a]++; h[a].push_back(b); h[b].push_back(a); } int root=1; for(int i=1;i<=N;i++){ if(book[i]==1){ root=i; break; } } dfs(root,0); printf("%d\n",ans+1); } return 0;}
阅读全文
0 0
- HDU 4714
- HDU 4714
- HDU 4714
- 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 (树形dp)
- hdu 4714 (树形dp)
- hdu 4714(树形dp)
- HDU-4714-树形dp
- HDU 4714 Tree2cycle
- 微服务,微架构[七]之springboot异常处理
- HDU 1879 继续畅通工程
- 0016、node 之富文本的使用
- CIFAR-10数据集可视化Python版本
- Spring MVC入门
- HDU 4714
- QTP破解
- Struts2核心技术(三)
- HDU4884 TIANKENG’s rice shop
- IO流呀IO流
- KMP算法最浅显理解——一看就明白
- tree命令安装
- (四) Java多线程详解之线程池的使用
- BZOJ1911 [Apio2010]特别行动队 斜率优化