poj3107(dfs,树形dp)
和poj1655的方法完全一样,但是这道题的n的范围大了,用vector存图会TLE(poj没有O2编译优化),所以改用前向星来存图就可以了。、
有关树的重心,看这里:poj1655
这里解释一下前向星存图的方法:
其实就是用静态链表来实现邻接链表,这样可以避免使用指针。
head[i]数组来记录每个节点的第一条边;每条边用结构体e[i]来存,e[i].v表示这条边指向的点,e[i].next表示这条边连向的下一条边。
它的巧妙之处在于每次插入到链表的首部而不是尾部,这样就避免了对链表的遍历。同一起点的各条边在邻接表中的顺序和读入顺序正好相反。
贴个模板:
struct node
{
int v,next;
}e[m];//m是总边数
int head[n],cnt;//n是总节点数,cnt记录边数
void init()
{
memset(head,-,sizeof(head));
cnt=;
}
void add(int u,int v)
{
e[cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt++;
}
本题AC代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
#define INF 100000000
#define eps 1e-8
#define pii pair<int,int>
#define LL long long int
struct node
{
int v,next;
}e[];
int n,a,b,head[],mi=;
int num[],bal[],cnt=;
void add(int aa,int bb);
int dfs1(int x,int fa);
void dfs2(int x,int fa);
int main()
{
//freopen("in1.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&n);
memset(head,-,sizeof(int)*(n+));
for(int i=;i<=n;i++) num[i]=;
for(int i=;i<=n-;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs1(,-);
dfs2(,-);
for(int i=;i<=n;i++)
{
if(bal[i]<bal[mi])
{
mi=i;
}
}
printf("%d",mi);
for(int i=mi+;i<=n;i++)
{
if(bal[i]==bal[mi])
{
printf(" %d",i);
}
}
printf("\n");
//fclose(stdin);
//fclose(stdout);
return ;
}
void add(int aa,int bb)
{
e[cnt].v=bb;
e[cnt].next=head[aa];
head[aa]=cnt++;
}
int dfs1(int x,int fa)
{
for(int i=head[x];i!=-;i=e[i].next)
{
if(e[i].v==fa)
continue;
else
{
num[x]+=dfs1(e[i].v,x);
}
}
return num[x];
}
void dfs2(int x,int fa)
{
for(int i=head[x];i!=-;i=e[i].next)
{
if(e[i].v==fa)
{
bal[x]=max(bal[x],n-num[x]);
}
else
{
bal[x]=max(bal[x],num[e[i].v]);
dfs2(e[i].v,x);
}
}
}
poj3107(dfs,树形dp)的更多相关文章
- 杭电OJ——1011 Starship Troopers(dfs + 树形dp)
Starship Troopers Problem Description You, the leader of Starship Troopers, are sent to destroy a ba ...
- POJ 1849 - Two - [DFS][树形DP]
Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...
- POJ3107 Godfather (树形DP)
题意:求树的重心 题解:先跑一遍dfs 预处理出这种遍历方式每个节点的儿子(含自己)的数 再跑一遍 每个点的值就是他所有儿子中取一个最大值 再和它父亲这个方向比较一下 又被卡常了 vector一直tl ...
- 图论--树的直径--DFS+树形DP模板
#include <iostream> #include <cstring> using namespace std; //maxv:源点能到的最远点,maxdis:最远点对应 ...
- Codeforces 765E. Tree Folding [dfs][树形dp]
题解:先从节点1开始dfs.对于每一个节点,用一个set记录:以该点为根的子树的深度. a) 如果此节点的某个子节点打出了GG,则此节点直接打出GG. b) 若set的元素个数<=1,那么,以该 ...
- poj2378(dfs,树形dp)
和poj3107,poj1655一样的方法 #include<iostream> #include<cstdio> #include<cstdlib> #inclu ...
- poj1655(dfs,树形dp,树的重心)
这是找树的重心的经典题目. 树的重心有下面几条常见性质: 定义1:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心.定义2:以这个点为根,那么所有的子树(不算整个树自身)的大 ...
- poj1655(dfs,树形dp,树的重心)(点分治基础)
题意:就是裸的求树的重心. #include<cstring> #include<algorithm> #include<cmath> #include<cs ...
- CF979C Kuro and Walking Route(简单的dfs/树形dp)
题意:给出一个$n$个点,$n-1$条边的无向连通图,给出两个点$x,y$,经过$x$后的路径上就不能经过$y$,问可以走的路径$(u,v)$有多少条,($(u,v)$和$(v,u)$考虑为两条不同的 ...
- 【bzoj2435】[NOI2011]道路修建 树形dp
题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修 ...
随机推荐
- Xamrin开发安卓笔记(二)
http://www.cnblogs.com/minCS/p/4112617.html Xamrin开发安卓笔记(二) 安装篇 Xamrin开发安卓笔记(一) 昨天调理一天AAPT.EXE 被推出 ...
- HDU - 6435 Problem J. CSGO 2018 Multi-University Training Contest 10 (二进制枚举+思维)
题意:有N个主武器(MW)和M个副武器(SW),每个武器都有自己的S值,和K个附加属性xi.要选取一对主副武器搭配,搭配后获得的性能由该公式得出: 求获得最大的性能为多少. 分析:由于|xm - xs ...
- Linux系统服务管理 服务管理
Linux独立服务管理 启动服务 systemctl start 服务名称.service 设置开机自启动 systemctl enable 服务名称.service 停止开机自启动 systemct ...
- CAS单点登录的原理
1.首先了解几个概念 1).TGC:Ticket-granting cookie,存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用.2).TGT:ticket grant ...
- 通过自动回复机器人学Mybatis:搭建核心架构
imooc视频学习笔记 ----> URL:http://www.imooc.com/learn/154 MessageDao.java package com.imooc.dao; impor ...
- article标准用法
article代表一个在文档.页面或者网站中自成一体的内容 其目的是为了让开或重用 譬如论坛的帖子.博客的文章.一片用户的评论.一个互动的widget小工具 article 会有一个标题(通常在hea ...
- 2018-2019-2 20165114《网络对抗技术》Exp5 MSF基础应用
Exp5 MSF基础应用 目录 一.实验目标 二.基础问题回答 三.实验过程记录 3.1主动攻击实践 ms08_067+generic/shell reverse_tcp ms17_010_etern ...
- 异步消息postEvent更新界面
其实就是和Qt::QueuedConnection时的信号槽一样,属于异步的. 1.新建QEvent子类 ①.头文件 #ifndef MYEVENT_H #define MYEVENT_H #incl ...
- CentOS限制SSH登录地址
编辑hosts.allow文件,将允许连接的地址写进去 [root@Elements ~]# vim /etc/hosts.allow sshd:10.10.10.1:allow sshd:172.1 ...
- [CF19E]Fairy
给定一张n个点m条边的无向图,求删除哪一条边后,能够确保构成一个二分图,输出所有可能 解法:我们知道二分图的性质是没有奇环,这道题我们也应该从这个方面入手来考虑. 如果没有奇环的话我们当然想怎么删就怎 ...