博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-3107 Godfather & POJ-2378 Tree Cutting(树的重心)
阅读量:2133 次
发布时间:2019-04-30

本文共 1256 字,大约阅读时间需要 4 分钟。

题目:

题意:给你一棵树,让你找到结点,使得剩下的联通块中的结点数量最大的尽量小
即树的重心的定义
思路:直接dfs找其子树的max(结点数量,n-结点数量)
这个题卡vector(而且poj竟然不支持auto
代码:

#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N = 5e4+5;struct edge{ int to,nxt; edge(int t = 0,int n = 0):to(t),nxt(n){}}E[N*2];int n,tot,head[N*2];int dp[N],num[N],pos[N],cnt,minn;void add_edge(int u,int v){ E[tot] = edge(v,head[u]); head[u] = tot++;}void dfs(int u,int fa){ num[u] = 1; for(int i = head[u];~i;i = E[i].nxt) { int v = E[i].to; if(v == fa) continue; dfs(v,u); num[u] += num[v]; dp[u] = max(dp[u],num[v]); } dp[u] = max(dp[u],n-num[u]); if(dp[u] < minn) { minn = dp[u]; cnt = 0; pos[cnt++] = u; } else if(dp[u] == minn) pos[cnt++] = u;}int main(){ tot = 0; memset(head,-1,sizeof(head)); scanf("%d",&n); int u,v; for(int i = 1;i < n;i++) { scanf("%d%d",&u,&v); add_edge(u,v); add_edge(v,u); } cnt = 0; minn = 50000; dfs(1,-1); sort(pos,pos+cnt); printf("%d",pos[0]); for(int i = 1;i < cnt;i++) printf(" %d",pos[i]); printf("\n"); return 0;}

转载地址:http://bkkgf.baihongyu.com/

你可能感兴趣的文章
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
iOS常用宏定义
查看>>
什么是ActiveRecord
查看>>
有道词典for mac在Mac OS X 10.9不能取词
查看>>
关于“团队建设”的反思
查看>>
利用jekyll在github中搭建博客
查看>>
Windows7中IIS简单安装与配置(详细图解)
查看>>
linux基本命令
查看>>
BlockQueue 生产消费 不需要判断阻塞唤醒条件
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
win10将IE11兼容ie10
查看>>
checkbox设置字体颜色
查看>>