博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj - 1655 Balancing Act
阅读量:7033 次
发布时间:2019-06-28

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

给出一个树,若去掉其中一个结点,剩下的子树中规模最大的树的规模(估且称为D值),就是该点的D值。求所有结点中D值最小的点,输出点及其D值。

这题用两次DFS,第一次求出所有结点的子结点数,第二次求出所有结点的D值。

1 #include 
2 #include
3 #include
4 #define N 20005 5 using namespace std; 6 vector
ed[N]; 7 int s[N],w[N],n; 8 int max(int a,int b) 9 {10 return a>b ?a :b ;11 }12 int dfs(int u, int fa)13 {14 int i;15 s[u] = 1;16 for(i = 0; i < ed[u].size(); i++)17 if(ed[u][i] != fa)18 s[u] += dfs(ed[u][i],u);19 //printf("s[%d]:%d\n",u,s[u]);20 return s[u];21 }22 void cal(int u, int fa)23 {24 int &ans = w[u],i,v,t=n-1;25 ans = 0;26 for(i = 0; i < ed[u].size(); i++)27 if(ed[u][i] != fa)28 {29 v = ed[u][i];30 cal(v,u);31 t -= s[v];32 if(s[v] > ans) ans = s[v];33 }34 ans = max(t,ans);35 //printf("f(%d):%d\n",u,ans);36 }37 int main()38 {39 int T,a,b,i,min,f;40 scanf("%d",&T);41 while(T--)42 {43 scanf("%d",&n);44 min = n;45 for(i = 1; i <= n; i++) ed[i].clear();46 for(i = 1; i < n; i++)47 {48 scanf("%d%d",&a,&b);49 ed[a].push_back(b);50 ed[b].push_back(a);51 }52 dfs(1,0);53 cal(1,0);54 for(i = 1; i <= n; i++)55 if(w[i] < min)56 {57 min = w[i];58 f = i;59 }60 printf("%d %d\n",f,min);61 }62 return 0;63 }

转载于:https://www.cnblogs.com/lzxskjo/archive/2012/11/08/2761665.html

你可能感兴趣的文章
Class.forName和ClassLoader.loadClass的区别
查看>>
PowerShell 学习笔记——使用帮助系统
查看>>
修复Intellij IDEA 15中文输入框不跟随问题
查看>>
MySQL集群搭建详解
查看>>
运维监控工具之 Nagios (一)
查看>>
JQuery自定义插件开发(二)
查看>>
select函数
查看>>
我的友情链接
查看>>
理解二叉搜索树
查看>>
Centos 配置iptables防火墙
查看>>
多态在 Java 和 C++ 编程语言中的实现比较
查看>>
数字签名
查看>>
在Linux 双机下自己手动实现浮动ip技术
查看>>
Spring 和 Hibernate 遇到问题
查看>>
一个页面的倒计时代码
查看>>
Node.js笔记(一)项目的建立
查看>>
PullToRefreshScrollView 滑动监听 actionbar渐变
查看>>
nginx错误解决方法个人总结
查看>>
利用Solid Converter PDF与Office优化处理文档信息
查看>>
spring boot 1.3.5 PUT方法接收参数
查看>>