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

    题目

    分析

    DFS,一次遍历,求出每个结点去除该点后的最大连通块的个数,同时更新ans(全局变量存放最终结果)

    代码

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 const int N = 100010;
     7 int h[N], e[N*2],ne[N*2],idx;//树为无向联通图,所以a->b,b->a
     8 bool st[N];//记录是否被访问过
     9 int ans = N;//保存最终结果
    10 int n;//结点个数
    11 
    12 //邻接表加入一条a->b的边
    13 void add(int a,int b){
    14    e[idx] = b,ne[idx] = h[a],h[a] = idx++;
    15 
    16 }
    17 
    18 //返回子节点个数
    19 int dfs(int u){
    20     st[u] = true;
    21     int sum = 1,res = 0;//注意sum为1,本身也算作一个节点,若为0,则都为0,res存放该节点最大连通块个数
    22     for(int i = h[u];i!=-1;i = ne[i]){
    23         int j = e[i];
    24         if(!st[j]){
    25             int s = dfs(j);//u的子节点的个数
    26             sum += s;//加上u本身
    27             res = max(res,s);
    28         }
    29     }
    30     res = max(res,n-sum);//找到删掉该节点后最大连通块的个数
    31     ans = min(res,ans);//找最小的最大值
    32     return sum;//返回子节点个数
    33     
    34 }
    35 int main(){
    36     cin>>n;
    37     memset(h,-1,sizeof(h));
    38     //树:n个结点n-1条边
    39     for(int i = 0;i < n-1;i++){
    40         int a,b;
    41         cin>>a>>b;
    42         add(a,b);
    43         add(b,a);
    44     }
    45     dfs(1);//从第一个结点开始
    46     printf("%d",ans);
    47     return 0;
    48 }

     注意图的存储是从1开始的

  • 相关阅读:
    R语言 逐步回归分析
    R语言 一元线性回归
    基于Qt的信号分析简单应用软件的设计
    【图论 5】图的应用——拓扑排序和关键路径
    【图论 3】图的应用——最小生成树
    B+树
    大概是最简明的B树博客了
    KMP算法
    【内存管理篇】基本分页存储管理方式
    双向链表为何时间复杂度为O(1)?
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/14437495.html
Copyright © 2011-2022 走看看