• Godfather(POJ3107)&&Tree Cutting(POJ2378)——求树的重心(递归)


    先贴上原题的链接

    题目大意是给定一个无根树,使得去掉一个点之后,剩下子树的节点数的最大值最小,也就是求树的重心。求树的重心的话,只需要设一个点为跟,然后递归下去,求出son[i](表示以i为根节点的子树的节点数量)以及除了以此节点为根节点的子树的剩下的节点数,用f数组来表示。然后让max(f[pos],son[posson],(posson为pos的子节点)最小的节点输出就可以了。以下是程序

    #include<iostream>
    #include<cstdio>
    using namespace std;
    struct nob{
    	int sta,ed,jump;
    }a[100005];
    int n,jump[50005],tot,son[50005],f[50005],mina=1e9;
    void add(int sta,int ed) {
    	tot++;
    	a[tot].ed=ed;
    	a[tot].jump=jump[sta];
    	jump[sta]=tot;
    }
    void dfs(int pos,int fa){
    	son[pos]=1;
    	for (int i=jump[pos]; i; i=a[i].jump){
    		if (a[i].ed==fa) continue;
    		dfs(a[i].ed,pos);
    		son[pos]+=son[a[i].ed];
    	}
    	f[pos]=n-son[pos];
    	for (int i=jump[pos]; i; i=a[i].jump){
    		if (a[i].ed==fa) continue;
    		f[pos]=max(f[pos],son[a[i].ed]);
    	}
    	mina=min(f[pos],mina);
    }
    int main(){
    	scanf("%d",&n);
    	for (int i=1,x,y; i<n; i++){
    		scanf("%d%d",&x,&y);
    		add(x,y);
    		add(y,x);
    	}
    	dfs(1,0);
    	for (int i=1; i<=n; i++)
    		if (f[i]==mina) printf("%d ",i);
    	return 0;
    }
    

    是不是很好奇为什么两个题目只放了一个题解?因为这两个题目是一样的

  • 相关阅读:
    面向对象和面向过程的区别
    k-means算法
    win10系统下安装mysql
    python并发编程之多进程
    操作系统的概念
    前端基础之html
    聚类分析
    决策树
    Mysql
    SQL练习题
  • 原文地址:https://www.cnblogs.com/cain-/p/7755146.html
Copyright © 2020-2023  润新知