Codeforces 982 C. Cut 'em all!(dfs)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces --- 982C Cut 'em all! DFS加贪心