Uva 6436 - The Busiest City 树形DP

原创 2013年12月01日 23:06:16

                 题意:

                           一棵树上有至多20000个点...现在问拆掉一个点..可以使得最多的两两不可达..输出最大的两两部可达..

                 题解:

                           只需统计以某点为根的子树节点数量..就可以推出每个点的答案了..找到最大的就是..而统计每个点做子树根节点数量..就是一个基本的树形DP...


Program:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAXN 20005
using namespace std;
struct node
{
       int v,next;
}edge[MAXN<<1];
int Ne,_next[MAXN],sum[MAXN],ans;
void addedge(int u,int v)
{
       edge[++Ne].next=_next[u],_next[u]=Ne;
       edge[Ne].v=v;
}
void dfs(int father,int u,int N)
{
       int k,v,m,temp;
       for (k=_next[u];k;k=edge[k].next)
       {
               v=edge[k].v;
               if (v==father) continue;
               dfs(u,v,N);
               sum[u]+=sum[v];
       }
       m=sum[u]*(N-1-sum[u]),temp=0;
       for (k=_next[u];k;k=edge[k].next)
       {
               v=edge[k].v;
               if (v==father) continue;
               temp+=sum[v]*(sum[u]-sum[v]);
       }
       m+=temp/2;
       ans=max(ans,m);
       sum[u]++;
}
int main()
{
       int C,cases,N,u,v,i; 
       scanf("%d",&C);
       for (cases=1;cases<=C;cases++)
       {
                scanf("%d",&N);
                Ne=0,memset(_next,0,sizeof(_next));
                for (i=1;i<N;i++)
                {
                        scanf("%d%d",&u,&v);
                        addedge(u,v),addedge(v,u);
                }
                ans=0;
                memset(sum,0,sizeof(sum));
                dfs(0,1,N);
                printf("Case #%d: %d\n",cases,ans);
       }
       return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

UVALive 6436 The Busiest City (树形DP)

题意:给出n个顶点,n-1条边,对于每一个顶点来说每有一条路径经过,繁荣度+1,求最大繁荣度。 思路:从任意一个节点开始dfs,找到当前根有多少子集,和不在当前根子集中的节点做乘法,就是当前根的子...
  • CillyB
  • CillyB
  • 2017年04月05日 17:54
  • 185

UVALive 6436 The Busiest City

题目链接:UVALive 6436 The Busiest City 题意:给你从1到n总共n个数字,同时给你n-1个连接,同时保证任意两个点之间都可以连接。现在假设任意两个点简单连通路过某点则某点的...
  • jealousygreed
  • jealousygreed
  • 2016年02月04日 22:04
  • 119

UVALive 6436 The Busiest City 【思维 + 树形dp想法】

传送门 // 题意: 给定一颗树, 定义一个点的繁荣度为经过这个点的路径的条数, 求这棵树的最大繁荣度为多少. 注意叶子结点路径数为0.// 思路: 我们首先要知到一个节点的繁荣度怎么算, 它 = ...
  • Anxdada
  • Anxdada
  • 2018年01月13日 19:19
  • 46

POJ 1849 Two (树形dp 树的直径 两种方法)

POJ 1849 Two (树形dp 树的直径 两种方法)
  • Tc_To_Top
  • Tc_To_Top
  • 2015年07月22日 14:52
  • 1356

树形 DP 总结

一、介绍 1、什么是树型动态规划  顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有...
  • AngOn823
  • AngOn823
  • 2016年08月27日 14:12
  • 1698

树形DP—依赖背包模板

void DP(int x){ for(int i=0;i
  • xlzhang223
  • xlzhang223
  • 2016年03月12日 12:25
  • 238

UVA-6436 The Busiest City 树形DFS求解

给出n个顶点,n-1条边,对于每一个顶点来说每有一条路径经过,繁荣度+1,求最大繁荣度。 经过的含义就是这条路径使用了跟这个顶点相连的边中的的两条,任意组合都可以,所以要找出每个顶点相连的边延伸出去...
  • q295657451
  • q295657451
  • 2014年08月15日 10:18
  • 734

树形dp 小结

只能勉强称之为树形dp的傻逼问题:[POJ1655]Balancing Act 树的重心,经典问题,但是非常简单啊。。。 用size维护一下就好辣! [BZOJ2435][Noi2011]道路修...
  • Clove_unique
  • Clove_unique
  • 2016年11月17日 22:32
  • 577

树形动态规划(树状DP)小结

树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系。利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索...
  • txl16211
  • txl16211
  • 2015年04月29日 23:10
  • 9976

树形动态规划(树形DP)入门问题—初探 & 训练

树形DP入门 poj 2342 Anniversary party   先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的...
  • txl16211
  • txl16211
  • 2015年04月29日 22:40
  • 10071
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Uva 6436 - The Busiest City 树形DP
举报原因:
原因补充:

(最多只允许输入30个字)