Codeforces 982 C. Cut 'em all!(dfs)

解题思路:

  代码中有详细注解,以任意一点为根,dfs遍历这棵树。

  每一个节点可能有好几个子树,计算每棵子树含有的节点数,再+1即为这整棵树的节点。

  判断子树是否能切断与根之间的联系,如果子树含有偶数个节点,则这棵子树可以被切断。

注意:

  若由于我们建立这棵树的时候不知道两个连接的节点谁是谁的父节点。

  所以我们在dfs中加个标记,找出除父节点以外的其他节点。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

list<int> l[100010];

int ans = 0;
int dfs(int u, int v){
    int sum = 0;
    for(list<int>::iterator it = l[u].begin();it != l[u].end(); it++){
        if(v != *it){    //封闭往回找,以免形成环。
            int ret = dfs(*it, u);
            sum += ret;    //sum统计以u为根的子树总共有多少节点。
            if(ret%2 == 0) ans++;//如果u节点连接的某棵子树含有偶个节点,则可以切断,
        }
    }
    return sum+1;//加上本身
}

int main(){
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    int u, v;
    int t = n-1;
    while(t--){
        cin >> u >> v;
        l[u].push_back(v);
        l[v].push_back(u);
    }
    if(n & 1){
        cout << -1 << endl;
        return 0;
    }
    dfs(1, 100010);
    cout << ans << endl;
    return 0;
}

Codeforces 982 C. Cut 'em all!(dfs)

原文地址:https://www.cnblogs.com/zhangjiuding/p/9057436.html

时间: 2024-08-28 11:51:59

Codeforces 982 C. Cut 'em all!(dfs)的相关文章

【Codeforces 723D】Lakes in Berland (dfs)

海洋包围的小岛,岛内的有湖,'.'代表水,'*'代表陆地,给出的n*m的地图里至少有k个湖,求填掉面积尽量少的水,使得湖的数量正好为k. dfs找出所有水联通块,判断一下是否是湖(海水区非湖).将湖按面积排序,若湖的数量为cnt,填掉前cnt-k个湖. http://codeforces.com/problemset/problem/723/D Examples input 5 4 1*****..*******.*..** output 1*****..*********..** input

EM算法(1):K-means 算法

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解 EM算法(1) : K-means算法 1. 简介 K-means算法是一类无监督的聚类算法,目的是将没有标签的数据分成若干个类,每一个类都是由相似的数据组成.这个类的个数一般是认为给定的. 2. 原理 假设给定一个数据集$\mathbf{X} = \{\mathbf{x}_1, \mathbf{x}_2,...,\mathbf{x}_N \}$, 和类的个数K.我们的每个类都用一个中心点$

EM算法(3):EM算法详解

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解

POJ 3087 Shuffle&#39;m Up (DFS)

题目链接:Shuffle'm Up 题意:有a和b两个长度为n的字符序列,现定义操作: 将a.b的字符交叉合并到一个序列c,再将c最上面的n个归为a,最下面n个归为b 给出a,b和目标序列c,问最少多少次操作a.b转化为c 解析:将a.b放入哈希表,然后模拟操作过程直接dfs即可. AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <map> using names

EM算法(2):GMM训练算法

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解

LeetCode Subsets (DFS)

题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. 1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 DFS(0,nums,tmp); 6 return a

POJ 1699 Best Sequence(DFS)

題目鏈接 題意 : 將幾個片段如圖所示方法縮成一個序列,求出最短這個序列. 思路 : 其實我也不知道怎麼做.....看網上都用了DP.....但是我不會.....這個DP不錯,還有用KMP+状压DP做的 1 //1699 2 #include <iostream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <string> 6 7 using namespace std; 8 9 string

LeetCode Subsets II (DFS)

题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) 1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 DFS(0,nums,tmp); 6 ans.push_back(vector

poj A Knight&#39;s Journey(DFS)

题目链接:http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=190592 题意:给出p*q的棋盘,从(A,1)开始,走“日”字,问能否走完棋盘上所有的点,如果能,按字典序输出路径: 思路:DFS,并保存路径即可,注意处理走的方向顺序int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; #include <stdio.h> #in