返回题解分享
讨论 / 题解分享/ 帖子详情

砍树(编程题) - 题解

#include
using namespace std;

const int N=1e5+100;

int tree_size[N];//tree_size[i]表示以i位根的子树中有多少个需要断开的点
vector >edge[N];//edge[i]存储第i个结点的<邻接点,边的编号>
int n,m,ans;

void dfs(int u,int father)//从第u个结点开始dfs,其父结点是father
{
for(const auto &v:edge[u])
{
int nex=v.first;//取u的邻接点nex
int idx=v.second;//取边(u,nex)的编号idx
if(nex==father)continue;
dfs(nex,u);//继续向下深搜
tree_size[u] += tree_size[nex];//累加需要断开的结点数量
if(tree_size[nex]==m)//以nex为根的子树,需要断开的结点数量达到了m,
//说明该结点恰好将m对边分成树内的m个点和树外的m个点,可以在此处断开
{
ans=max(ans,idx);//更新最大的边的编号
}
}
}

int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i
0 回复 0 转发 0 喜欢 2 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!