HDU 4424 Conquer a New Region
http://acm.hdu.edu.cn/showproblem.php?pid=4424
【题目大意】
给你N个点和N-1条边的连通图,也就是说任意两点间的路径是唯一的。每条边有个权值,从一点到另一点的最大流量是路径中所有边中权值的最小值。要你找一个点,使得这点到剩下所有点的最大流量之和最大,求这个最大流量和。
【分析1:动态规划 】
假设现在有两个点的集合S1和S2,添加的一条边可以使得这两个集合连通起来,要求最大的流量之和,那么只有两种情况:1、选取的中心点在S1中;2、选取的中心点在S2中。设S中其最小权值的边为E,它连接S1、S2,假设中心点在S1,那么S2中所有的点要连接到中心点必然要通过E这条边过去,且这条边是短板;中心点在S2也类似,所以可以得到如下的DP方程:
DP[S]=max{DP[S1]+e.c*count[S2] , DP[S2]+e.c*count[S1] } (e.c为边的权值,count为集合中点的数量)
可以用搜索的方法来求对于每层枚举找到最小的边E,再递归下去,直到集合只含一个点,这是种逆向求解的想法,从整体到局部再反推回答案。
【分析2:并查集 & 贪心】
动态规划的方法虽然正确,复杂度也还算可以,但是复杂,涉及到集合的运算和从集合中遍历元素等等... 所以有种贪心的想法:既然每次都是取最小的边,那么随着递推下去,取的边构成的数列是递增有序的,那为什么不直接先把边排序好呢?既然在动态规划中涉及到集合的分裂,那为什么不反过来用集合的合并来求解?这两个是可以同时做到的。
所以可以得到以下做法: 把边从大到小排序,依次选取边的两点所在的集合来合并,并更新集合的元素个数和当前的最大和,用并查集就好了。这种方法其实是动态规划的逆向求解,但本质还是动态规划。
【代码】
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n;
long long sum[];
int mset[];
struct egde
{
int a,b,c;
void read(){scanf("%d%d%d",&a,&b,&c);}
bool operator<(const egde& t)const {return c>t.c;}
}data[];
int find(int x)
{
if (mset[x]<) return x;
return mset[x]=find(mset[x]);
}
void uion(int a,int b,int c)
{
int aa=find(a);
int bb=find(b);
long long sum1=sum[aa]+(long long)c*-mset[bb];
long long sum2=sum[bb]+(long long)c*-mset[aa];
if (sum2>sum1) {swap(aa,bb);swap(a,b);swap(sum1,sum2);}
mset[aa]+=mset[bb];
mset[bb]=aa;
sum[aa]=sum1;
}
int main()
{
while (~scanf("%d",&n))
{
memset(sum,,sizeof sum);
memset(mset,-,sizeof mset);
for (int i=;i<n-;++i) data[i].read();
sort(data,data+n-);
for (int i=;i<n-;++i)
uion(data[i].a,data[i].b,data[i].c);
printf("%I64d\n",sum[find()]);
}
}
HDU 4424 Conquer a New Region的更多相关文章
- ZOJ 3659 & HDU 4424 Conquer a New Region (并查集)
这题要用到一点贪心的思想,因为一个点到另一个点的运载能力决定于其间的边的最小权值,所以先把线段按权值从大到小排个序,每次加的边都比以前小,然后合并集合时,比较 x = findset(a) 做根或 y ...
- hdu 4424 Conquer a New Region (并查集)
///题意:给出一棵树.树的边上都有边权值,求从一点出发的权值和最大,权值为从一点出去路径上边权的最小值 # include <stdio.h> # include <algorit ...
- HDU 4424 Conquer a New Region 最大生成树
给你一颗树 每条边有一个权值 选择一个点为中心 定义S值为中心到其它n-1个点的路径上的最小边权 求全部点S值的和 从大到小排序 每次合并2棵树 设为A集合 B集合 设A集合的最大S值的和为sumA ...
- HDOJ 4424 Conquer a New Region
并检查集合 侧降序,每增加一个侧面应该推断,其中基本建设方..... Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Me ...
- hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)
Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- zoj 3659 Conquer a New Region The 2012 ACM-ICPC Asia Changchun Regional Contest
Conquer a New Region Time Limit: 5 Seconds Memory Limit: 32768 KB The wheel of the history roll ...
- ZOJ3659 Conquer a New Region 并查集
Conquer a New Region Time Limit: 5 Seconds Memory Limit: 32768 KB The wheel of the history roll ...
- hdu4424 Conquer a New Region 并查集/类似最小生成树
The wheel of the history rolling forward, our king conquered a new region in a distant continent.The ...
- hdu 4424 并查集
思路:将边从大到小排序,判断向哪边连,能使总和最大. #include<map> #include<set> #include<cmath> #include< ...
随机推荐
- 安装、设置与启动MySql5.1.30绿色版的方法
1.解压 mysql-noinstall-5.1.30-win32.zip(下载地址http://dev.mysql.com/downloads/mysql/5.1.html) 2.在 F 盘建立目录 ...
- kindeditor 上传图片 显示绝对 路径
在前台页面上 效果图 另外附上 urlType 属性的 参数说明: 改变站内本地URL,可设置空.relative.absolute.domain. 空为不修改URL,relative为相对路径,ab ...
- Win8增加了快速启动功能......
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-05-11) Win8增加了快速启动功能,能让计算机尽快的启动进入Windows界面.win8的这种快速启动功能只会在“关机 ...
- Slony-I的删除:
接前篇:http://www.cnblogs.com/gaojian/p/3196244.html 简单的Slony-I设置实例 如何删除slony相关的内容呢. 我再另外找一台机器,安装slony, ...
- Codeforces Round #189 (Div. 1) B. Psychos in a Line 单调队列
B. Psychos in a Line Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/p ...
- 关于ORACLE DUAL表
1.DUAL表的用途 Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中--查看当前连接用户 SQL> select user from d ...
- 比较长的sql语句
SELECT o. * FROM hq_goods g LEFT JOIN hq_orders o ON o.goods_id = g.id WHERE o.user_id =73 AND o.sta ...
- Struts2中属性驱动与模型驱动
属性驱动: 1.概念 能够利用属性驱动获取页面表单元素的内容 2.步骤 1.在action中声明属性,属性的名称和页面元素中name属性的值保持一致 2.action中的属性必须有set和get方法 ...
- android安卓 SQLite教程:内部架构及SQLite使用办法
SQLite 介绍 SQLite一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.由于JDBC不适合手机这种内存受限设备,所以Android开发人员需要学习新的API ...
- 使用mysqladmin ext 了解MySQL运行状态 转
https://yq.aliyun.com/articles/11210?spm=0.0.0.0.HpobXF 1. 使用-r/-i参数 使用mysqladmin extended-status命令可 ...