博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF982C Cut 'em all! DFS 树 * 二十一
阅读量:6333 次
发布时间:2019-06-22

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

 Cut 'em all!
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You're given a tree with nn vertices.

Your task is to determine the maximum possible number of edges that can be removed in such a way that all the remaining connected components will have even size.

Input

The first line contains an integer nn (1n1051≤n≤105) denoting the size of the tree.

The next n1n−1 lines contain two integers uu, vv (1u,vn1≤u,v≤n) each, describing the vertices connected by the ii-th edge.

It's guaranteed that the given edges form a tree.

Output

Output a single integer kk — the maximum number of edges that can be removed to leave all connected components with even size, or 1−1 if it is impossible to remove edges in order to satisfy this property.

Examples
input
Copy
4 2 4 4 1 3 1
output
Copy
1
input
Copy
3 1 2 1 3
output
Copy
-1
input
Copy
10 7 1 8 4 8 10 4 7 6 5 9 3 3 5 2 10 2 5
output
Copy
4
input
Copy
2 1 2
output
Copy
0
Note

In the first example you can remove the edge between vertices 11 and 44. The graph after that will have two connected components with two vertices in each.

In the second example you can't remove edges in such a way that all components have even number of vertices, so the answer is 1−1.

 

#include #include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define debug(a) cout << #a << " " << a << endlusing namespace std;const int maxn = 1e5 + 10;const int mod = 1e9 + 7;typedef long long ll;int hd[maxn], ne[maxn*2], to[maxn*2], num, n, siz[maxn], ans;void add( int x, int y ) { to[++num]=y, ne[num]=hd[x], hd[x]=num;} void dfs( int x, int fa ) { siz[x]=1; for( int i = hd[x]; i; i = ne[i] ) { if(to[i]!=fa){ dfs(to[i],x); siz[x]+=siz[to[i]]; } } if(!(siz[x]&1)) siz[x]=0,ans++;} int main(){ std::ios::sync_with_stdio(false); scanf("%d",&n); int uu, vv; for( int i = 1; i < n; i ++ ) { scanf("%d%d",&uu,&vv); add(uu,vv), add(vv,uu); } if( n & 1 ) { puts("-1"); return 0; } dfs( 1, -1 ), ans--; printf("%d\n", ans ); return 0;}

 

转载于:https://www.cnblogs.com/l609929321/p/9249990.html

你可能感兴趣的文章
Highcharts X轴纵向显示
查看>>
windows 注册表讲解
查看>>
【算法】论平衡二叉树(AVL)的正确种植方法
查看>>
基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍
查看>>
react 从零开始搭建开发环境
查看>>
scala recursive value x$5 needs type
查看>>
ps -ef |grep 输出的具体含义
查看>>
markdown编辑
查看>>
ASCII 在线转换器
查看>>
Linux内核同步:RCU
查看>>
Android逆向进阶——让你自由自在脱壳的热身运动(dex篇)
查看>>
Java设计模式之五大创建型模式(附实例和详解)
查看>>
60 Permutation Sequence
查看>>
主流的RPC框架有哪些
查看>>
Hive学习之路 (七)Hive的DDL操作
查看>>
[转]mysql使用关键字作为列名的处理方式
查看>>
awesome go library 库,推荐使用的golang库
查看>>
树形展示形式的论坛
查看>>
jdbcTemplate 调用存储过程。 入参 array 返回 cursor
查看>>
C++中的stack类、QT中的QStack类
查看>>