Offer收割赛25 #1567 偶树分割
来源:互联网 发布:文件翻译软件 编辑:程序博客网 时间:2024/06/08 08:34
- 样例输入
6 1 2 3 1 4 1 1 5 6 2
- 样例输出
1
代码出自:
描述
如果一棵树节点数目是偶数,那么就称这棵树是偶树。给定一棵N个节点的偶树(编号1~N),小Hi想知道他最多可以同时切断多少条边,使得剩下的森林中每一个联通分量都是一棵偶树。
例如如下的偶树:
1 / | | \ 2 3 4 5 | 6
可以切断1-2之间边使得剩下的每个联通分量都是偶树。
输入
第一行包含一个偶数N。
以下N-1行每行包含两个整数a和b,表示a和b之间有一条边。
对于30%的数据,1 ≤ N ≤ 20
对于100%的数据, 1 ≤ N ≤ 100000
输出
输出最多可以切断的边数。
http://hihocoder.com/user/1731
思路:
统计奇子树的个数 dfs就行
ps:
有时间补上详细的分析。
代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//这题的问题可以转化为统计奇数子树的个数
public class Main{
static List<Integer>[] edges;
static boolean[] use;
static int ans;
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
edges = new List[n];
for(int i=0;i < n;i++)edges[i] = new ArrayList<>();
for(int i=0;i < n-1;i++){
int a = in.nextInt()-1;
int b = in.nextInt()-1;
edges[a].add(b);
edges[b].add(a);
}
use = new boolean[n];
//从0节点开始深度优先访问
dfs(0);
System.out.println(ans);
}
//深度优先
static int dfs(int node){
//状态设置为访问,
use[node] = true;
int sum =1;
for(int child:edges[node]){
if(!use[child]){
int num = dfs(child);
//统计拥有奇数个子孙的树个数
if(num % 2 == 0) ans ++;
sum += num;
}
}
//状态设置为退出
use[node] = false;
//返回的是子树节点的个数
return sum;
}
}
- Offer收割赛25 #1567 偶树分割
- [Offer收割]编程练习赛25:偶树的切分
- hihocoder offer收割赛。。#1284
- [Offer收割]编程练习赛1
- hiho[Offer收割]编程练习赛1
- 2016 [Offer收割]编程练习赛3
- [Offer收割] 编程练习赛3
- 微软offer收割赛之智力竞赛
- [Offer收割]编程练习赛4
- [Offer收割]编程练习赛4
- [Offer收割]编程练习赛7
- [Offer收割]编程练习赛4
- [Offer收割]编程练习赛8
- [Offer收割]编程练习赛3
- [Offer收割]编程练习赛10
- hihocoder [Offer收割]编程练习赛19
- hihocoder [Offer收割]编程练习赛24
- [Offer收割]编程练习赛24
- angularjs实现国际化
- https OutputStream 传递中文乱码
- jsoup分页2
- 给穷鬼创业者的话:没有千万甚至上亿还是别做App,你那几十万还不如炒房
- 「杀不掉的」僵尸(zombie)进程
- Offer收割赛25 #1567 偶树分割
- 关于图片保存(Android)
- Android零基础入门第58节:数值选择器NumberPicker
- 你想要什么样的人生
- ln -s 使用
- iOS沙盒机制和文件(三)
- 【第二周项目1】 C/C++语言中函数参数传递的三种方式
- mfc CListctrl响应单击事件开启新的对话框
- java 高并发中的一些问题