题目链接:https://vjudge.net/contest/241341#problem/C

题目大意:给你从1到n总共n个数字,同时给你n-1个连接,同时保证任意两个点之间都可以连接。现在假设任意两个点简单连通路过某点则某点的繁荣度+1,求所有点的最大繁荣度。

解题思路:以它为例,根据题意,对于C节点我们要计算它的繁荣度,一般大家都会的,肯定就是1*1+1*3+1*3=7;也就是说是以C为根节点的任意两颗子树节点个数的乘积的和,不过这样感觉好像很复杂啊,又要计算以每个节点为根节点的子树节点个数又还要把他们两个两个乘起来再相加,代码不好写不说,而且肯定会超时。

那该怎么做呢,这里需要转换思维了,任意一点的繁荣度应该等于:以它为根节点的每个子树节点个数乘以除这颗子树以及根节点外其它所有节点的和,即子树1*除去子树1和根节点个数+子树2*除去子树2和根节点的节点个数+……,依次类推,不过这样每个都乘了两次,所以算出的结果再除2就行了,这样就简单多了。

代码的实现:把整个图看成以1号节点为根的大树,用一个cnt数组来存储以当前节点个根节点形成的树的节点个数,然后写一个DFS,搜索树的各个子树的节点个数。

具体见代码:

 #include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=;
ll n,ans,cnt[maxn];
vector<int> tree[maxn]; //存储边的信息构成一颗树 void DFS(int now,int pre) //now为当前节点,pre为父亲节点
{
cnt[now]=;
ll sum=;
int len=tree[now].size(); //以当前节点为根的树的子树的个数
for(int i=;i<len;i++) //遍历所有子树
{
int x=tree[now][i];
if(x==pre) continue; //不包含父亲节点
DFS(x,now);
cnt[now]+=cnt[x]; //当前节点为根的树的节点总数等于其他所有子树节点的和
sum+=cnt[x]*(n-cnt[x]-); // 子树x与剩余节点数目的乘积
}
sum+=(cnt[now]-)*(n-cnt[now]); //父亲节点所在分支也为now的一个子树,也要加上
ans=max(ans,sum/);
return;
} int main()
{
int t;
cin>>t;
int kase=;
while(t--)
{
cin>>n;
ans=;
for(int i=;i<maxn;i++)
tree[i].clear(); //清空
for(int i=;i<n;i++)
{
int a,b;
cin>>a>>b;
tree[a].push_back(b); //无向图a到b即b到a
tree[b].push_back(a);
}
DFS(,);
printf("Case #%d: %lld\n",kase++,ans);
}
return ;
}

UVALive - 6436(DFS)的更多相关文章

  1. UVALive - 6436 —(DFS+思维)

    题意:n个点连成的生成树(n个点,n-1条边,点与点之间都连通),如果某个点在两点之间的路径上,那这个点的繁荣度就+1,问你在所有点中,最大繁荣度是多少?就比如上面的图中的C点,在A-B,A-D,A- ...

  2. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  3. LeetCode Subsets II (DFS)

    题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) class Solution { publ ...

  4. LeetCode Subsets (DFS)

    题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. class Sol ...

  5. HDU 2553 N皇后问题(dfs)

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在 ...

  6. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  7. 【算法导论】图的深度优先搜索遍历(DFS)

    关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS). 深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点, ...

  8. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  9. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

随机推荐

  1. 2091: [Poi2010]The Minima Game

    2091: [Poi2010]The Minima Game 链接 分析: 首先排序后,一定是选的连续的一段. f[i]表示前i个位置,先手-后手的最大得分. 那么考虑第i个位置是否选,如果选,先手选 ...

  2. ElasticSearch实践系列(一):安装

    Elasticsearch简介 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎.它允许您快速,近实时地存储,搜索和分析大量数据.它通常用作底层引擎/技术,为具有复杂搜索功能和要求的 ...

  3. 阿里云centos内docker的搭建

    由于docker在17之后的版本分成了docker EE(企业版)和docker CE(社区版),那么我们在安装的时候就要开始纠结的选择了,这里我推荐了docker CE(社区版). 实际上这两个版本 ...

  4. 2-Twenty Fifth Scrum Meeting-20151231

    前言 因为服务器关闭,我们的开发项目也遭遇停滞一个星期.与网站开发负责人员协商之后,29号开放服务器.我们的项目也能够继续下去.比规定的开发时间(截止为2015/12/29)推迟. 事项安排 1.开发 ...

  5. 07-java学习-方法重载-idea集成开发工具学习-项目-模块-包

    方法重载的概念? 方法重载的好处? 集成开发工具idea的学习 下载 安装 设置 建项目 导入项目 建模块 导入模块 建包 复制粘贴包 建类 复制粘贴类 运行 调试

  6. vue 项目引入字体报错

    vue 项目引入特殊字体,总是提示有问题 原因是,在webpack 里面的配置有问题 在项目文件里面引入字体的时候,应该写url-loader 而不能是url

  7. PyXB: Python XML Schema Bindings

    http://pyxb.sourceforge.net/ PyXB (“pixbee”) is a pure Python package that generates Python source c ...

  8. Docker Clustering Tools Compared: Kubernetes vs Docker Swarm

    https://technologyconversations.com/2015/11/04/docker-clustering-tools-compared-kubernetes-vs-docker ...

  9. Essential Netty in Action 《Netty 实战(精髓)》读书笔记一

    NIO 最初是为 New Input/Output 的缩写.然而,Java 的 API 已经存在足够长的时间,它不再是新的.现在普遍使用的缩写来表示Nonblocking I/O (非阻塞 I/O). ...

  10. Linux net core docker hello world 简单使用

    安装.net core From 官网 sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft ...