poj 4045
来源:互联网 发布:android编程软件 编辑:程序博客网 时间:2024/05/22 12:58
http://poj.org/problem?id=4045
思路:
1.先用一次dfs() 求出顶点 1 安放power station 的答案 和 各个顶点为根的树的顶点数
2。dfs()每个边 u- > v , 如果已知ans[ u ] 那么 ans[ v ] = ans[u] + n -cnt[ v ] - cnt[ v ]
代码转自 :http://fayaa.com/code/view/26409/
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<vector>#include<queue>#include<math.h>#include<string>#include<map>#include<set>using namespace std;typedef __int64 ll;#define MAXN 50010vector<int> e[MAXN],ans;int cnt[MAXN],dsum[MAXN];int dmin[MAXN],n;void dfs(int pre,int u){ cnt[u]=1; dsum[u]=0; for(int i=0;i<e[u].size();i++){ if(e[u][i]==pre) continue; dfs(u,e[u][i]); cnt[u]+=cnt[e[u][i]]; dsum[u]+=dsum[e[u][i]]+cnt[e[u][i]]; }}void dfs2(int pre,int u){ for(int i=0;i<e[u].size();i++){ if(e[u][i]==pre) continue; int v=e[u][i]; dmin[v]=dmin[u]+n-2*cnt[v]; dfs2(u,e[u][i]); }}int main(){ int T, I, R ,x ,y; scanf("%d", &T); while (T--) { scanf("%d%d%d", &n,&I,&R); for(int i=0;i<=n;i++) e[i].clear(); for(int i=0;i<n-1;i++){ scanf("%d%d",&x,&y); e[x].push_back(y); e[y].push_back(x); } dfs(1,1); dmin[1]=dsum[1]; dfs2(1,1); int Min=1<<30; for(int i=1;i<=n;i++) Min=min(Min,dmin[i]); printf("%I64d\n",(ll)Min*I*I*R); ans.clear(); for(int i=1;i<=n;i++) if(dmin[i]==Min) ans.push_back(i); for(int i=0;i<ans.size();i++){ if(i==ans.size()-1) printf("%d\n",ans[i]); else printf("%d ",ans[i]); } printf("\n"); }}
- poj 4045
- poj 4045 Power Station
- POJ-4045-数据结构+dfs
- POJ 4045 power station
- poj 4045 树形dp
- poj 4045 (树形DP)
- Power Station POJ 4045
- POJ 4045Power Station
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- 自定义下拉菜单Spinner的使用
- sqlserver 多重嵌套事务的存储过程处理与解决方法
- 【转】Linux下输出彩色字符[转载]
- IIS Autostart with Managed Extensibility Framework
- java线程学习笔记
- poj 4045
- hdu 3666 #差分约束
- window phone 7 开发学习笔记(二)—— XAML简介
- HQL具体用法
- shape
- jrtplib--代码笔记
- php过滤恶意html字符
- DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC
- linux c/c++ rename_file方法的问题