Codeforces --- 982C Cut 'em all! DFS加贪心
题目链接:
https://cn.vjudge.net/problem/1576783/origin
输入输出:
Examples
inputCopy
4
2 4
4 1
3 1
outputCopy
1
inputCopy
3
1 2
1 3
outputCopy
-1
inputCopy
10
7 1
8 4
8 10
4 7
6 5
9 3
3 5
2 10
2 5
outputCopy
4
inputCopy
2
1 2
outputCopy
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
题目大意:
这道题其实题意很简单,给你一棵树,让你删边,然后得到的子树节点个数要是偶数。
而边的个数在离散数学里定义是 m = n-1, 这个在建树的时候需要注意!
DFS的作用是统计这个节点连接的节点的个数,具体实现在代码中有注释。
下面是AC代码:
#include <iostream>
#include <cstdio>
#include <vector>
#define pb push_back
#include <string.h> using namespace std;
const int MX = 1e5+;
int vis[MX], sum[MX];
int n;
vector<int> G[MX]; int dfs(int x)
{
for(int i = ; i < G[x].size(); ++i)
{
int u = G[x][i];
if(!vis[u])
{
vis[u] = ; // 经过的点先标记一下
sum[x] += dfs(u); //沿着点DFS
vis[u] = ; // 回溯
}
}
sum[x]++; // 经过一个点则需要加一
return sum[x];
} int main()
{
int ans = ;
memset(vis, , sizeof(vis));
memset(sum, , sizeof(sum));
scanf("%d", &n);
for(int i = ; i <= n-; ++i) // 建树初始化m = n-1
{
int u, v;
scanf("%d%d", &u, &v);
G[u].pb(v);
G[v].pb(u); // 无向图!
}
if(n%) //节点为奇数则不可能都分为偶数节点的连通图
{
printf("-1\n");
return ;
}
vis[] = ; // 初始节点的vis先标记为一
dfs();
for(int i = ; i <= n; ++i)
{
//cout << sum[i] << ' ';
if(sum[i]% == ) ans++; // 节点个数为偶数则减
}
//cout << endl;
printf("%d\n", ans-); //减一的理由是根节点节点数一定为偶数,但是其不能减。。
}
如有疑问,欢迎评论指出!
Codeforces --- 982C Cut 'em all! DFS加贪心的更多相关文章
- codeforces 982C Cut 'em all!
题意: 给出一棵树,问最多去掉多少条边之后,剩下的连通分量的size都是偶数. 思路: 如果本来就是奇数个点,那么无论去掉多少条边都不可能成立的. 如果是偶数个点,就进行一次dfs,假设一个点的父亲是 ...
- CF982C Cut 'em all! DFS 树 * 二十一
Cut 'em all! time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Cut 'em all! CodeForces - 982C(贪心dfs)
K - Cut 'em all! CodeForces - 982C 给一棵树 求最多能切几条边使剩下的子树都有偶数个节点 如果n是奇数 那么奇数=偶数+奇数 不管怎么切 都会有奇数 直接打印-1 贪 ...
- Codeforces 982C(dfs+思维)
C. Cut 'em all! time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- CodeForces 982 C Cut 'em all!
Cut 'em all! 题意:求删除了边之后,剩下的每一块联通块他的点数都为偶数,求删除的边最多能是多少. 题解:如果n为奇数,直接返回-1,因为不可能成立.如果n为偶数,随意找一个点DFS建树记录 ...
- codeforces 615 B. Longtail Hedgehog (DFS + 剪枝)
题目链接: codeforces 615 B. Longtail Hedgehog (DFS + 剪枝) 题目描述: 给定n个点m条无向边的图,设一条节点递增的链末尾节点为u,链上点的个数为P,则该链 ...
- hdu 4004 (二分加贪心) 青蛙过河
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4004 题目意思是青蛙要过河,现在给你河的宽度,河中石头的个数(青蛙要从石头上跳过河,这些石头都是在垂 ...
- Codeforces Round #613 (Div. 2)D(贪心,分治)
构造两颗深度为30的字典树(根节点分别是0和1),结点只有0和1,从根节点向下DFS,贪心取答案. #define HAVE_STRUCT_TIMESPEC #include<bits/stdc ...
- Codeforces 982 C. Cut 'em all!(dfs)
解题思路: 代码中有详细注解,以任意一点为根,dfs遍历这棵树. 每一个节点可能有好几个子树,计算每棵子树含有的节点数,再+1即为这整棵树的节点. 判断子树是否能切断与根之间的联系,如果子树含有偶数个 ...
随机推荐
- 1: jsp的4个作用域 pageScope、requestScope、sessionScope、applicationScope的区别
1.区别: 1.page指当前页面有效.在一个jsp页面里有效 2.request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletReq ...
- busybox编译
sync.c:(.text.sync_main+0x7c): undefined reference to `syncfs'Coreutils—>sync选项去掉 nsenter.c:(.tex ...
- layui加载层
layer.load(1, { shade: [0.5, '#000'], //0.5透明度的灰色背景 content: '注册中...', success: function (layero) { ...
- js的几大重点
闭包,:作用域(函数创建),上下文环境(函数执行,会销毁) 匿名函数,:没有函数名的函数,function(){} 自执行函数,:立即调用的匿名函数,(function(){})() 原型链,:继承的 ...
- dpkg用管道批量删除deb
dpkg -l |grep deepin|awk '{print $2}'|xargs sudo dpkg -P
- JAVA传递带有空格的参数
String s="b2 + b1"; Process child = Runtime.getRuntime().exec("C:\\eclipse-workspace\ ...
- XSS攻击常识及常见的XSS攻击脚本汇总
一.什么是XSS? XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了. 这里我们主要注 ...
- java(10)类的无参方法
一.变量的作用域(有效的使用范围) 1.变量有2种 1.1成员变量(属性) 声明在类的里面,方法的外面 1.2 局部变量 声明在方法里面或for循环结构中 2.调用时的注意事项(初始值不同.作用域不同 ...
- 设计模式九: 观察者模式(Observer Pattern)
简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...
- 易度文档管理系统--http://www.everydo.com/
易度文档管理系统--http://www.everydo.com/ 公司工程技术部门需要,暂收藏.