博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4424
阅读量:5104 次
发布时间:2019-06-13

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

题目链接:

题意:给你一颗树,树中每条边有一权值c,对于从i节点到j节点的路径,其权值定义为该路径上边权值的最小值,于是问找到一个中心点,使得从该点到其他节点的路径权值和最大,求该最大值。

思路;要使得权值和最大,容易想到对边进行从大到小排序,用一个sum来记录权值,cnt来记录节点个数,然后每次合并时取权值和较大的那个即可。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 #define MAXN 200200 7 typedef long long LL; 8 int parent[MAXN]; 9 LL sum[MAXN];10 int cnt[MAXN];11 struct Edge{12 int u,v,w;13 }edge[MAXN];14 int n;15 16 void Initiate()17 {18 memset(sum,0,(n+2)*sizeof(sum[0]));19 for(int i=0;i<=n;i++){20 parent[i]=i;21 cnt[i]=1;22 }23 }24 25 int Find(int x)26 {27 if(x==parent[x])28 return x;29 parent[x]=Find(parent[x]);30 return parent[x];31 }32 33 void Union(int r1,int r2,LL w)34 {35 parent[r1]=r2;36 cnt[r2]+=cnt[r1];37 sum[r2]+=w;38 }39 40 int cmp(const Edge &p,const Edge &q)41 {42 return p.w>q.w;43 }44 45 int main()46 {47 // freopen("1.txt","r",stdin);48 while(~scanf("%d",&n))49 {50 Initiate();51 for(int i=0;i
tmp2){62 Union(r2,r1,tmp1-sum[r1]);63 }else64 Union(r1,r2,tmp2-sum[r2]);65 }66 printf("%I64d\n",sum[Find(1)]);67 }68 return 0;69 }
View Code

 

 

转载于:https://www.cnblogs.com/wally/archive/2013/06/10/3131271.html

你可能感兴趣的文章
2018 计蒜之道 初赛 第五场 A 贝壳找房搬家
查看>>
51 Nod 1086 多重背包问题(单调队列优化)
查看>>
Visual studio变慢
查看>>
快速排序QuickSort——C/C++
查看>>
json
查看>>
Oracle 11g修改字符集AL32UTF8为ZHS16GBK
查看>>
jq form表单自动赋值
查看>>
06.FileStream类的学习
查看>>
linux dns搭建
查看>>
vim中的正则表达式替换
查看>>
strongswan--linux内核ipsec policy类型
查看>>
Binding基础
查看>>
java后台设计简单的json数据接口,设置可跨域访问,前端ajax获取json数据
查看>>
jQuery 添加元素
查看>>
ESFramework ——成熟的C#网络通信框架(跨平台)
查看>>
iOS基础知识之多态问题
查看>>
2017.3.16 上午
查看>>
HTTP状态码大全
查看>>
(私人收藏)第七届山东省中小学生机器人大赛接力赛解决方案
查看>>
Hue的全局配置文件hue.ini(图文详解)
查看>>