Poj 3107 树的重心,前向星
来源:互联网 发布:淘宝网发布禁售信息 编辑:程序博客网 时间:2024/05/10 10:50
今天美团的比赛打得和屎一样,D似乎是一个点分治,但是我TM完全没写过,于是就直接弃赛去学了。在ACdreamer处写了两个重心模板题,第一个很顺利,第二个莫名T了,看了discuss发现卡了我一直用的vector,于是又在ACdreamer这里学了下前向星,把我T的代码xjb改了下就过了,看来这玩意卡常数很管用,之后尽量多用吧。
代码:
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;int n, msiz, tot, cnt;struct Edge{ int to, next;}edge[50500<<1];int head[50500];bool vis[50500];int siz[50500];int rsiz[50500];int ans[50500];void init(){ memset(head, -1, sizeof(head)); cnt=0;}void add(int u, int v){ edge[cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt++;}void dfs(int u){ vis[u]=true; siz[u]=1; int tmp=0; for(int i=head[u];~i;i=edge[i].next){ int v=edge[i].to; if(!vis[v]){ dfs(v); siz[u]+=siz[v]; tmp=max(tmp, siz[v]); } } tmp=max(tmp, n-siz[u]); if(tmp<msiz){ msiz=tmp; } rsiz[u]=tmp;}int main(){ while(~scanf("%d", &n)){ init(); for(int i=1;i<n;i++){ int x, y; scanf("%d%d", &x, &y); add(x, y); add(y, x); } memset(vis, false, sizeof(vis)); msiz=n; dfs(1); tot=0; for(int i=1;i<=n;i++)if(rsiz[i]==msiz)ans[++tot]=i; for(int i=1;i<=tot;i++)printf("%d%c", ans[i], i==tot?'\n':' '); }}
胡扯一下,之前有遇到要删边(双向)的情况,这个似乎可以搞,但是大概除了next还要记录pre,这样就和双向链表一样方便删除了,而且由于正反向边一般是成对添加,所以反向边很好找到(异或1即可)。
之前CF也挂了个树形依赖背包,正好借这个契机把树上问题好好搞一搞。
阅读全文
0 0
- Poj 3107 树的重心,前向星
- POJ 3107树的重心
- 树的重心 poj
- Poj 3107 Godfather (树的重心)
- POJ 3107 Godfather (树的重心)
- poj 3107 Godfather 求树的重心
- poj 3107 求树的所有重心
- POJ 3107 求树的重心
- poj 3107 Godfather(树的重心)
- POJ 3107 dfs 树的重心
- 【POJ 3107 】Godfather 【树的重心】
- POJ 1655 树的重心
- poj 1655 树的重心
- poj 1655 树的重心
- 【求树的重心】POJ
- poj-1655 树的重心
- 树的重心 poj-1655
- [poj]P1655树的重心
- 如何在宿主机上查询虚拟机的ip
- java lambda表达式示例
- java读取文件内容的方法总结
- Java中获取完整的url
- 实现容器的底层技术
- Poj 3107 树的重心,前向星
- pDHS-SVM:A prediction method for plant DNase I hypersensitive sites based on support vector machine
- 计算机网络——路由算法
- IE Firefox 在进行某些跳转时请求头中不会附加 Referer 字段信息
- 2017-6-14·····································mutt的使用-设置邮件头
- 乐观锁和悲观锁
- 《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求)
- 编程娱乐之五子棋
- 【实训】第七周总结下