zoukankan      html  css  js  c++  java
  • 树的重心

    树的重心:对于一颗n个节点的无根树,找到一个点,使得把树变成以该节点为根的有根树时,最大子树的节点数最小,也就是说删除这个点后最大联通块的节点数最小

    其实求树的重心算是一个比较基础的树形dp。用dp[i]代表以i为根的子树的所有节点个数(包含i节点本身),如果要以i为重心的话,那么其最大子树的节点数就是max(max(dp[j]), n - dp[i]),其中j为i的孩子节点。一遍dfs跑下去所有的信息就都能得到了树的重心也就能求出来了。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <map>
     
    using namespace std;
     
    const int maxn = 2 * 1e4 + 100;
     
    int t, n, top;
    int dp[maxn], head[maxn];
     
    struct Edge {                 //链式前向星存储树
    	int v, next;
    }edge[maxn << 1];
     
    inline void add(int u, int v) {
    	edge[top].v = v;
    	edge[top].next = head[u];
    	head[u] = top++;
    }
     
    inline void Init() {
    	memset(head, -1, sizeof(head));
    	top = 0;
    }
     
    int mins, id;
     
    void dfs(int u, int father)
    {
    	dp[u] = 1;        //u节点自身先算上
    	int maxs = 0;
    	for(int i = head[u]; i != -1; i = edge[i].next)
    	{
    		int v = edge[i].v;
    		if(v != father)
    		{
    			dfs(v, u);
    			dp[u] += dp[v];  
    			maxs = max(maxs, dp[v]);   //求最大的节点数量
    		}
    	}
    	maxs = max(maxs, n - dp[u]);
    	if(maxs < mins)
    	{
    		mins = maxs;
    		id = u;
    	}
    }
     
    int main()
    {
    	//freopen("in.txt", "r", stdin);
    	cin >> t;
    	while(t --)
    	{
    		scanf("%d", &n);
    		Init();
    		int u, v;
    		for(int i = 1; i <= n - 1; ++ i)
    		{
    			scanf("%d%d", &u, &v);
    			add(u, v);
    			add(v, u);
    		}
    		mins = 0x3f3f3f3f;
    		dfs(1, 0);
    		cout << id << ' ' << mins << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    ES(一): 架构及原理
    Durid(二): 数据集及存储
    Durid(一): 原理架构
    【DataBase】H2 DateBase与项目集成
    【DataBase】H2 DateBase的拓展使用
    【Mybatis】MyBatis之插件开发(十)
    【DataBase】H2 DateBase的简单使用
    【DataBase】Hsqldb与项目集成
    【DataBase】Hsqldb的简单使用
    【Mybatis】MyBatis之Generator自动生成代码(九)
  • 原文地址:https://www.cnblogs.com/kamimxr/p/11269690.html
Copyright © 2011-2022 走看看