Power Station POJ 4045
题意:给你一棵树,让你求一点,使该点到其余各点的距离之和最小。如果这样的点有多个,则按升序依次输出。
树型dp
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
using namespace std;
const int maxn=50010;
typedef __int64 LL;
vector<int>tree[maxn];// to save the relation
LL f[maxn],g[maxn],dp[maxn];//f[u] u as root to all his sons' distance g[u]the number of u'sons
set<int> myqueue;
void dfs(int u,int pa){
/* 以1为根,所有的子树到他们的子节点的和 */
if(tree[u].size() == 1 && u != 1){
g[u]=1;
f[u]=0;
return;
}
for(int v=0;v < tree[u].size();v++){
if(tree[u][v]!=pa){
dfs(tree[u][v],u);
g[u]+=g[tree[u][v]];//the son's sons' number
f[u]+=f[tree[u][v]]+g[tree[u][v]];
}
}
g[u]++;// himself
}
void dfs2(int u,int pa){// to sum the way from his father
//再考虑从父节点来的
if(tree[u].size()==1 && u!=1){
dp[u]=dp[pa]+g[1]-(g[u]<<1);
return;
}
for(int v=0;v<tree[u].size();v++){
if(tree[u][v]!= pa){
//到某节点的距离的和=该节点子树的距离和(在dfs1中获得)+从父亲那一支子树获得的和(此时,父节点那一支看成子树)。dp[儿子]=dp[父节点]-dp[儿子]-g[儿子](儿子到父节点这条路被减了子树的子节点数的次数) + dp[儿子]+(g[1]-g[儿子])(父树上的所有节点)
dp[tree[u][v]]=dp[u]+g[1]-(g[tree[u][v]]<<1);
dfs2(tree[u][v],u);//先算了之后再跑子树
}
}
}
int main(){
int t;
int n,I,R,a,b;
scanf("%d",&t);
LL mmin;
while(t--){
scanf("%d%d%d",&n,&I,&R);
for(int i=0;i<=n;i++){
tree[i].clear();
}
for(int i=2;i<=n;i++){
scanf("%d%d",&a,&b);
tree[a].push_back(b);
tree[b].push_back(a);
}
// for(int i=0;i<=n;i++){
// for(int j=0;j<tree[i].size();j++){
// printf("%d ",tree[i][j]);
// }
// printf("\n");
// }
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
dfs(1,-1);
dp[1]=f[1];
dfs2(1,-1);
mmin=dp[1];
myqueue.clear();
myqueue.insert(1);
for(int i=2;i<=n;i++){
if(dp[i]<mmin){
mmin=dp[i];
myqueue.clear();
myqueue.insert(i);
}
if(dp[i]==mmin) myqueue.insert(i);
}
//warning : output long long should be I64d
printf("%I64d\n",I*I*R*mmin);//use set not num but the op
for(set<int>::iterator it=myqueue.begin();it!=myqueue.end();++it){
printf("%d ",*it);
}
printf("\n\n");
}
}
Power Station POJ 4045的更多相关文章
- Power Network (poj 1459 网络流)
Language: Default Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 23407 ...
- Power Network - poj 1459 (最大流 Edmonds-Karp算法)
Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24788 Accepted: 12922 Description A ...
- Building a Space Station POJ - 2031
Building a Space Station POJ - 2031 You are a member of the space station engineering team, and are ...
- Power Strings POJ - 2406
Power Strings POJ - 2406 时限: 3000MS 内存: 65536KB 64位IO格式: %I64d & %I64u 提交 状态 已开启划词翻译 问题描述 Gi ...
- poj - 4045 - Power Station
题意:一棵有n个结点的树,要取其中的一个结点,使得该结点到其他所有结点的距离和dis最小,即损耗I * I * R * dis最小,输出最小损耗和该结点(有多个的话按结点编号从小到大输出)(3 < ...
- ( KMP 求循环节的个数)Power Strings -- poj -- 2406
链接: http://poj.org/problem?id=2406 Power Strings Time Limit:3000MS Memory Limit:65536KB 64bi ...
- (最小生成树) Building a Space Station -- POJ -- 2031
链接: http://poj.org/problem?id=2031 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6011 ...
- Building a Space Station POJ 2031 【最小生成树 prim】
http://poj.org/problem?id=2031 Description You are a member of the space station engineering team, a ...
- Power Strings (poj 2406 KMP)
Language: Default Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 33205 ...
随机推荐
- LXC-Linux Containers介绍
Linux Containers,Linux的容器,容器嘛,可以想象成一个大的装东西的罐子,罐子口很大,里面可以装很多同样形状,只不过大小不同的小罐子.专业的话,叫做基于容器的操作系统层面的虚拟化技术 ...
- C插入排序
#include "stdio.h" int main() { ,,,,,}; int i,j; ;j<]);j++) { int key = a[j]; ;i>=&a ...
- 使用visual studio测试功能进行暴力破解
web项目上线前需要做访问压力测试,奈何对这方面不懂,所以自己网上搜索了下相关工具没有找到合适的,就自己研究了下visual studio 2013中的测试项目,发现还挺好使的,结合数据库还能用做暴力 ...
- C#基础(八)——C#数据类型的转换
C#数据类型的转换主要有以下几种方式: 1.强制转换 注意:char类型不能强制转换成int,如果使用强制转化,得到的是原整数的ASCII码值. 2.class.parse(string类型的变量), ...
- T-SQL数组循环
T-SQL对字符串的处理能力比较弱,比如要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦.下边的函数,实现了象数组一样去处理字符串 ...
- 布局—column(属性)
column-width:||用来定义多列中每列的宽度,用像素表示column-count:||用来定义多列中的列数,用数字来表示1-10columns: 200px 2||列宽和列数column-g ...
- 判断IE版本的语句 [if lte IE 6]...[endif]
<!–[if lte IE 6]>……<![endif]–>Ite:less than or equal to意思是小于或等于IE6浏览器,用于IE浏览器的条件注释,常用于CS ...
- 使用GruntJS构建Web程序
Gruntjs是JavaScript项目的构建工具,也是基于node的一个命令行工具.很多开源JS项目都是使用它搭建.如jQuery.Qunit.CanJS等.它有以下作用 合并JS文件 压缩JS文件 ...
- json 语义分析
json 中:元素与值用冒号 ":" 隔开元素与元素用逗号 "," 隔开{} 之间是一个对象, 对象可以层层嵌套[] 表示数组, 数组元素用逗号 ", ...
- (转载)MS SQL Server 未公开的加密函数有哪些?
MS SQL Server 未公开的加密函数有哪些? 以下的文章是对MS SQL Server 未公开的加密函数的具体操作,如果你对其相关的实际操作有兴趣的话,你就可以点击了. MS SQL Serv ...