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

思路:我们可以想一下,繁荣度是怎么来的?假设一个点的度是2,相当于以这个点为根,有两棵子树,那繁荣度就是这两棵子树上各取一个点两两组合,最后的结果就是两棵子树上的点的乘积。所以不难推出,若度大于2,那繁荣度就是所有子树上的点树两两相乘的和,例如上图的C点,度为3,且3个度包含的点的个数分别为1,1,3,繁荣度 = 1*1 + 1*3 + 1*3 = 7。

然而,这样的计算方式复杂度有点高,若度为n,光计算繁荣度就要O(n*n),更何况这只是一个点的繁荣度。所以,我们还可以简化一下计算方式:

计算出每一棵子树的点的个数,用每个子树的点的个数乘以除了这棵子树以及根节点以外剩余的点,,每棵子树都这样计算,并将结果相加,求出的和除以2,就是结果。

因为这样的计算方式和之前相比,相当于两两之间都乘了两次,子树1*所有子树的和(除自己) = 子树1*子树2* + 子树1*子树3 + .....  + 子树1*子树n, 子树2*所有子树的和(除自己) = 子树2*子树1 + 子树2*子树3 + ... + 子树2*子树n;这之中,子树1*子树2 ,又子树2*1子树,计算了两次,所以最终结果要除以2。

我们可以将整个图看成一棵以节点1为根的树,这样将会简化很多。除此之外,还可以使用链式前向星,记录下某个点与哪些点直接相连。这样,就可以节省寻找子树的时间

具体看代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#define eps 1e-7
#define ll long long
#define inf 0x3f3f3f3f
#define pi 3.141592653589793238462643383279
using namespace std;
const int maxn = ;
int head[maxn],num,n;
ll ans,sum,size[maxn];
struct node{
int to,next;
}edge[maxn<<]; void add(int u,int v) //使用链式前向星计算每个点于那些点直接相连
{
edge[num].to = v;
edge[num].next = head[u];
head[u] = num++;
} void DFS(int u,int fa) //将整个图看成一棵树,u为当前节点,fa为父亲节点
{
ll res = ;
size[u] = ; //size[u]表示以u为根的树有多少个节点
for(int i=head[u]; i!=-; i=edge[i].next) //遍历所有子树
{
int to = edge[i].to;
if(to == fa) continue; //不计算父亲节点
DFS(to,u);
size[u] += size[to]; //以u为根的树的节点总数等于他所有子树的节点树之和
res += (n - size[to] - )*size[to]; //计算子树与其他剩余点的乘积
}
res += ( n - size[u] )*(size[u]-); //除所有子树外,u的根节点连成的树也是以u为根的一课子树
ans = max(ans,res/);
return;
} int main()
{
int t,cnt = ;
cin>>t;
while(t--)
{
ans = -;
num = ;
memset(head,-,sizeof(head));
memset(size,,sizeof(size));
scanf("%d",&n);
int start,end;
for(int i=; i<n-; ++i)
{
scanf("%d%d",&start,&end);
add(start,end); //start于end直接相连
add(end,start);//无向图,反过来也相连
}
DFS(,-);
printf("Case #%d: %lld\n",cnt++,ans);
}
return ;
}

UVALive - 6436 —(DFS+思维)的更多相关文章

  1. UVALive - 6436、HYSBZ - 2435 (dfs)

    这两道题都是用简单dfs解的,主要是熟悉回溯过程就能做,据说用bfs也能做 道路修建(HYSBZ - 2435) 在 W 星球上有n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道 ...

  2. UVALive.3708 Graveyard (思维题)

    UVALive.3708 Graveyard (思维题) 题意分析 这标题真悲伤,墓地. 在周长为1e4的圆周上等距分布着n个雕塑,现在要加入进来m个雕塑,最终还要使得这n+m个雕塑等距,那么原来的n ...

  3. hdu6035[dfs+思维] 2017多校1

    /*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...

  4. D. Eternal Victory(dfs + 思维)

    D. Eternal Victory time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. UVALive - 6436(DFS)

    题目链接:https://vjudge.net/contest/241341#problem/C 题目大意:给你从1到n总共n个数字,同时给你n-1个连接,同时保证任意两个点之间都可以连接.现在假设任 ...

  6. hiboCoder 1041 国庆出游 dfs+思维

    先抽象出一棵以1做为根结点的树.给定了访问序列a[1..m]. 考虑两种特殊情况: 1.访问了某个a[j],但是存在a[i]没有访问且i < j,出现这种情况说明a[j]一定是a[i]的祖先节点 ...

  7. newcoder F石头剪刀布(DFS + 思维)题解

    题意:wzms 今年举办了一场剪刀石头布大赛,bleaves 被选为负责人. 比赛共有 2n 个人参加, 分为 n 轮, 在每轮中,第 1 位选手和第 2 位选手对战,胜者作为新的第 1 位选手, 第 ...

  8. UVALive 5107 dfs暴力搜索

    题目链接:A hard Aoshu Problem DES:给三个字符串,包含的字符是A-E范围内的.长度都不超过8.每个字符可以而且只可以匹配一个数字.两个字符不能匹配相同的数字.前两个式子之间可以 ...

  9. UVALive 5844 dfs暴力搜索

    题目链接:UVAive 5844 Leet DES:大意是给出两个字符串.第一个字符串里的字符可以由1-k个字符代替.问这两个字符串是不是相等.因为1<=k<=3.而且第一个字符串长度小于 ...

随机推荐

  1. RK3288 开机动画旋转

    CPU:RK3288 系统:Android 5.1 如果开机动画与屏显示方向不一致,有两种方法可以更改开机动画方向. 一.RK3288默认的开机动画是由两张图片组合而成的,可以直接旋转两张图片的方向. ...

  2. Ruby中数组的遍历

    转自:http://www.jianshu.com/p/8de9b60f9350 Ruby中有几个常用的遍历数组的方法,本人经常容易搞混.这里列出来总结一下. each: 从数组中取出一个元素,作为某 ...

  3. 【DataGuard】部署Data Guard相关参数详解 (转载)

    原文地址:[DataGuard]部署Data Guard相关参数详解 作者:secooler    有关物理Data Guard部署参考<[DataGuard]同一台主机实现物理Data Gua ...

  4. string ids=aduuids.Aggregate("", (m, n) => m + n+",").TrimEnd(',');

    string ids=aduuids.Aggregate("", (m, n) => m + n+",").TrimEnd(',');

  5. JDK常用命令

    转自:https://www.cnblogs.com/saiQsai/p/10353044.html 1.jps 查看java进程,得到进程ID:7854 作用等同于:ps -ef | grep ja ...

  6. aws代理

    ssh -i ~/.ssh/seoul-notification-dev.pem  ec2-user@52.79.58.125ssh -CqTnN -D localhost:7080   -i ~/. ...

  7. 单源最短路:Dijkstra算法 及 关于负权的讨论

    描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...

  8. jQuery的表单选择器

    1.常规选择器选择表单标签 $(function () { // var a = $("input").eq(0).val() // alert(a) // // var b = ...

  9. Bind搭建DNS服务

    DNS域名解析服务(Domain Name System)是用于解析域名与IP地址对应关系的服务,功能上可以实现正向解析与反向解析: 正向解析:根据主机名(域名)查找对应的IP地址. 反向解析:根据I ...

  10. VMTurbo:应对散乱虚拟机的强劲工具

    随着服务器虚拟化技术越来越成熟,虚拟机散乱(VM sprawl)和主机资源管理成为了虚拟化数据中心的管理员眼里的两大问题.面对这种情形,一种可行的解决办法就是使用一款名为VMTurbo(vmturbo ...