description
给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1。树的节点编号从1开始。在这个问题中,你需要使用最小的消耗值(加边和删边操作)将这棵树转化为环,不允许有重边。
环的定义如下:
(1)该图有N个点,N条边。
(2)每个顶点的度数为2。
(3)任意两点是可达的。
树的定义如下:
(1)该图有N个点,N-1条边。
(2)任意两点是可达的。
analysis
-
对于叶子节点不用管它,只有一个儿子的节点也不用管
-
对于有多个儿子的节点,会只减剩一个儿子
-
注意根节点可以少减一个儿子
-
dfsdfsdfs就可以知道哪些节点要断几条边
-
然而爆栈所以bfsbfsbfs
code
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define MAXN 1000005
#define MAXM MAXN<<1
#define ll long long
#define fo(i,a,b) for (ll i=a;i<=b;++i)
#define fd(i,a,b) for (ll i=a;i>=b;--i)
#define rep(i,a) for (ll i=last[a];i;i=next[i])
using namespace std;
ll last[MAXM

这篇博客探讨如何在最小消耗下,通过添加和删除边将一棵树转化为环。树的节点数为N,转化条件包括所有节点度数为2且任意两点可达。分析中提到,DFS可能导致栈溢出,因此采用BFS解决此问题。
最低0.47元/天 解锁文章
775

被折叠的 条评论
为什么被折叠?



