博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 3659 Conquer a New Region
阅读量:7239 次
发布时间:2019-06-29

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

题意:给你n个点,以及n-1条边和它的权值。定义S(i,j)为从i到j路径上权值最小的边的权值。求最大的 ∑S(i,j)。j从1到n。

思路:并查集。用point数组维护每一个集合的权值和点的个数,point[i][0]为权值,point[i][1]为集合点数。先将边降序排列。然后枚举每一条边,判断point[u][0]+w*point[v][1]和point[v][0]+w*point[u][1]的大小。如果前者大 就把v点所在集合并入u所在集合,然后把u集合的权值和点数更新,后者大就把u点所在集合并入v所在集合,然后把v集合的权值和点数更新。最后输出仅剩一个集合的权值。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int MAXN=210000;struct Edge{ int u,v; ll w;}edge[210000];int n;ll point[MAXN][2];int par[MAXN];bool cmp(Edge a,Edge b){ return a.w>b.w;}int find(int x){ return x==par[x]?x:par[x]=find(par[x]);}void init(){ for(int i=0;i<=n;i++) par[i]=i,point[i][1]=1,point[i][0]=0;}int main(){ //freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF) { init(); for(int i=0;i
point[y][0]+w*point[x][1]) { par[y]=x; point[x][0]+=w*point[y][1]; point[x][1]+=point[y][1]; } else { par[x]=y; point[y][0]+=w*point[x][1]; point[y][1]+=point[x][1]; } } printf("%lld\n",point[find(1)][0]); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/onlyAzha/p/4783955.html

你可能感兴趣的文章
JS 做时钟
查看>>
学习XMLHttpRequest
查看>>
Python:基础知识(二)
查看>>
EntityViewInfo包含了FilterInfo(过滤)、Selector(指定属性)以及Sorter(排序)
查看>>
hdfs的shell命令
查看>>
配置vue-devtools调试工具
查看>>
【酷熊科技】工作积累 ----------- Unity3D button 回调事件
查看>>
程序员修炼之道读后感2
查看>>
几个常见移动平台浏览器的User-Agent
查看>>
IOS 数据存储之 FMDB 详解
查看>>
纯数学教程 Page 324 正项级数绝对收敛的一种判别法
查看>>
关于键保留表的一些汇总
查看>>
python全栈开发 * 29知识点汇总 * 180712
查看>>
电源磁珠选择
查看>>
Android线控的使用
查看>>
《C陷阱与缺陷》阅读笔记(个人版)
查看>>
项目管理过程 (1)
查看>>
hdu 3033
查看>>
Redis (windows)安装
查看>>
Axure基础操作
查看>>