[Poj 3107] Godfather 链式前向星+树的重心

题意

http://poj.org/problem?id=3107

给定一棵树,找到所有重心,升序输出,n<=50000。

链式前向星存储图

链式前向星是前向星的升级版本,是一种特殊的边集数组,有n条边,数组开n*2,切记!切记!!(由于要正反两次存边,也就是一条边要存两次),空间利用率高,并且速度比使用vector快,本题使用vector就TLE了一次。。

建立如下结构体:

struct node{
int to,next,w;
}edge[maxe]

其中edge[i].to表示第i条边的终点,edge[i].next表示与第i条边同起点的下一条边的存储位置(使用链式前向星存储遍历的时候是逆序遍历的,所有这里其实是前一条边的位置),edge[i].w表示第i条边的权值

inline void add(int u,int v,int w){
edge[cnt].w=w,edge[i].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}

初始cnt=0,表示第几条边

其中head[u]表示以u为起点的第一条边的存储位置,实际上,由于head[u]的值会不断被覆盖,存储的实际上是最后一条边的位置,遍历的时候其实是逆序遍历的

head[]一般初始化为-1

遍历以u节点为起始位置的所有边,终止位置i=-1

for(int i=head[u];~i;i=edge[i].next)

更详细的解释参考这篇博客:https://blog.csdn.net/acdreamers/article/details/16902023

树的重心

树的重心也叫树的质心,删除这个节点后,所有子树中最大子树节点数最小,也就是删点之后生成的多颗树尽可能平衡。

性质

  1. 树中所有节点到某个点的距离之和,到重心的距离和是最小的。
  2. 两棵树通过一条边相连,新树的重心在原来两棵树的重心连线上。
  3. 一棵树添加或删除一个节点,树的重心最多只移动一条边的位置。
  4. 一棵树最多两个重心,且相邻

算法实现

只需一遍dfs,复杂度O(n),遍历过程中找到以每个节点为根的子树中最大的子树(节点数最多),在所有最大子树中取最小值。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std;
const int maxe=5e4+5; int n;
int mNode,mBalacne=0x7f7f7f7f;
int scld[maxn];
struct node{
int to,next;
}edge[maxe*2]; int head[maxn],cnt=0;
inline void add(int x,int y){
edge[cnt].to=y;
edge[cnt].next=head[x];
head[x]=cnt++;
}
int ans[maxn],id=0;
void dfs(int u,int pa){
int maxSubT=0; scld[u]=1;
for(int i=head[u];~i;i=edge[i].next){
int cld=edge[i].to;
if(cld!=pa){
dfs(cld,u);
scld[u]+=(scld[cld]);
//找除从父亲节点出发的那颗子树外,剩下的最大子树的节点个数的最大值
maxSubT=max(maxSubT,scld[cld]);
}
}
//最后和从父亲节点出发的那颗子树比较,找到以当前节点为根的最大子树
//这里的子树都是不包括当前节点的
maxSubT=max(maxSubT,n-scld[u]);
// cout<<u<<":"<<scld[u]<<" "<<maxSubT<<" "<<mBalacne<<endl; if(maxSubT<mBalacne){
id=0,ans[id++]=u;
mBalacne=maxSubT;
}
else if(maxSubT==mBalacne){
ans[id++]=u;
}
//cout<<id<<endl;
}
int main(){
memset(head,-1,4*maxn);
cin>>n;
int x,y;
for(int i=0;i<n-1;i++){
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1,0);//随便取一个节点开始遍历
sort(ans,ans+id);
for(int i=0;i<id;i++){
if(i)putchar(' ');
printf("%d",ans[i]);
}
return 0;
} /*
6
1 2
1 3
2 4
2 5
5 6 6
1 3
1 4
1 5
2 3
2 6 6
1 2
1 4
1 3
2 5
4 6
*/

# [Poj 3107] Godfather 链式前向星+树的重心的更多相关文章

  1. 链式前向星版DIjistra POJ 2387

    链式前向星 在做图论题的时候,偶然碰到了一个数据量很大的题目,用vector的邻接表直接超时,上网查了一下发现这道题数据很大,vector可定会超的,不会指针链表的我找到了链式前向星这个好东西,接下来 ...

  2. POJ 3169 Layout(差分约束+链式前向星+SPFA)

    描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

  3. POJ 1655 Balancing Act ( 树的重心板子题,链式前向星建图)

    题意: 给你一个由n个节点n-1条边构成的一棵树,你需要输出树的重心是那个节点,以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的 题解: 树的重心定义:找到一个点,其所 ...

  4. 链式前向星+SPFA

    今天听说vector不开o2是数组时间复杂度常数的1.5倍,瞬间吓傻.然后就问好的图表达方式,然后看到了链式前向星.于是就写了一段链式前向星+SPFA的,和普通的vector+SPFA的对拍了下,速度 ...

  5. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

  6. hdu2647 逆拓扑,链式前向星。

    pid=2647">原文地址 题目分析 题意 老板发工资,可是要保证发的工资数满足每一个人的期望,比方A期望工资大于B,仅仅需比B多1元钱就可以.老板发的最低工资为888元.输出老板最 ...

  7. 图的存储结构:邻接矩阵(邻接表)&链式前向星

    [概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...

  8. 【模板】链式前向星+spfa

    洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...

  9. zzuli 2131 Can Win dinic+链式前向星(难点:抽象出网络模型+建边)

    2131: Can Win Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 431  Solved: 50 SubmitStatusWeb Board ...

随机推荐

  1. Python数据抓取(1) —数据处理前的准备

    (一)数据抓取概要 为什么要学会抓取网络数据? 对公司或对自己有价值的数据,80%都不在本地的数据库,它们都散落在广大的网络数据,这些数据通常都伴随着网页的形式呈现,这样的数据我们称为非结构化数据 如 ...

  2. 转载一篇比较详细的讲解html,css的一篇文章,很长

      转载自这里,转载请注明出处. DIV+CSS系统学习笔记回顾   第一部分 HTML 第一章 职业规划和前景 职业方向规划定位: web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 ...

  3. php &#编码/php unicode转码/php &#数字编码

    今天使PHP开发用到了Unicode的编码与解码,将unicode转为中文,再将中文转Unicode这样的操作是非常常见的,所以小编将这两个unicode中文互转函数给作为一个笔记保存起来,非常的简单 ...

  4. js实现回到顶部功能

    js实现回到顶部功能 一.总结 一句话总结: 可以通过js或者jquery可以很快的控制页面的属性,比如高度等等 //设置当前视口的顶端数值 var setScrollTop = function(t ...

  5. centos 下 安装vim

    我们在安装完Centos后,它默认的是安装了VI编辑器,VIM是没有安装的,所以我们在使用vim test.txt时会提示: vim command not found ... 这就是说明我们的Lin ...

  6. mybatis配置文件祥解(mybatis.xml)

    以下是mybatis.xml文件,提倡放在src目录下,文件名任意 <?xml version="1.0" encoding="UTF-8"?> & ...

  7. 在业务控制方法中写入User,Admin多个模型收集参数

    1)  可以在业务控制方法中书写1个模型来收集客户端的参数 2)  模型中的属性名必须和客户端参数名一一对应 3)  这里说的模型不是Model对象,Model是向视图中封装的数据 @Controll ...

  8. selenium 常见事件操作

    1.文本框输入内容 from selenium import webdriverdriver = webdriver.Chrome(r"C:\Users\Administrator\Desk ...

  9. 单元测试unittest及报告生成(两种报告模板)

    Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 在说unittest之前,先说几个概念: TestC ...

  10. Centos7.4 下cobbler安装及配置

    1.背景介绍 作为运维,在公司经常遇到一些机械性重复工作要做,例如:为新机器装系统,一台两台机器装系统,可以用光盘.U盘等介质安装,1小时也完成了,但是如果有成百台的服务器还要用光盘.U盘去安装,就显 ...