题目链接: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. 【Qt】窗口居中显示

    w.move((a.desktop()->width() - w.width())/, (a.desktop()->height() - w.height())/); 上述方法可以置中,但 ...

  2. Jlink使用技巧之合并烧写文件

    前言 IAP(In-application-programming),即在应用中编程.当产品发布之后,可以通过网络方便的升级固件程序,而不需要拆机下载程序.IAP系统的固件一般由两部分组成,即Boot ...

  3. R语言学习 第十篇:包

    包(Package)是实现特定功能的.预先写好的代码库(library),通俗地说,包是含有函数.数据等的功能模块.R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量 ...

  4. SpringBoot日记——分布式篇

    思考:什么是分布式?什么是微服务? 一些概念:RPC-远程过程调用,某台机器想要调用另一台机器所需要的一种服务,及分布式的服务框架,比如dubbo或者SpringCloud. 铺天盖地的分布式互联网系 ...

  5. 基于MongodbDB的用户认证-运维笔记

    MongoDB默认是不认证的,默认没有账号,只要能连接上服务就可以对数据库进行各种操作,MongoDB认为安全最好的方法就是在一个可信的环境中运行它,保证之后可信的机器才能访问它,可能这些对一些要求高 ...

  6. 数组-在Shell脚本中的基本使用介绍

    Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节.下面是对shell脚本中数组方面一些操作在此进行记录,希望能帮助到有兴趣的朋友~1. ...

  7. 浏览器数据库 IndexedDB 入门

    一.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的 ...

  8. 002-打开文件管理规范-20190406.bat

    rem 002-打开文件管理规范-20190406.bat start /max https://www.cnblogs.com/delphixx/p/10652763.htmlcopy %~0 C: ...

  9. Record for Individual Project ( Word frequency program )

    1.  预计时间 ● 对问题总体的理解.规划:10 min ● 设计编写程序:5 h ● 调试: 分模块-40 min; 总体-40min ● 测试(性能分析).改进:1 h 2.  实际用时 ● 对 ...

  10. linux第二次读书笔记

    <Linux内核设计与实现>读书笔记 第五章 系统调用   第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用 ...