ZOJ 3659 & HDU 4424 Conquer a New Region (并查集)
这题要用到一点贪心的思想,因为一个点到另一个点的运载能力决定于其间的边的最小权值,所以先把线段按权值从大到小排个序,每次加的边都比以前小,然后合并集合时,比较 x = findset(a) 做根或 y = findset(b) 做根时,总权值的大小,x做根的总权值 ca = num[b]*w + cap[a] ,b同理。即b这个集合的点个数乘以新加的边的距离为新增的权值。然后合并。。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <utility>
#define Mod 1000000007
using namespace std;
#define N 200010 int fa[N];
ll cap[N];
int num[N];
ll ans; void makeset(int n)
{
for(int i=;i<=n;i++)
{
fa[i] = i;
num[i] = ;
cap[i] = ;
}
} int findset(int x)
{
if(x != fa[x])
{
fa[x] = findset(fa[x]);
}
return fa[x];
} void unionset(int a,int b,int c)
{
int x = findset(a);
int y = findset(b);
if(x == y)
return;
ll ca = (ll)num[y]*c + cap[x]; //一定要手动转化成long long
ll cb = (ll)num[x]*c + cap[y];
if(ca >= cb)
{
fa[y] = x;
num[x] += num[y];
cap[x] = ca;
}
else
{
fa[x] = y;
num[y] += num[x];
cap[y] = cb;
}
ans = max(ans,max(ca,cb));
} struct node
{
int u,v,w;
}se[N]; int cmp(node a,node b)
{
return a.w>b.w;
} int main()
{
int n,i;
int a,b,c;
while(scanf("%d",&n)!=EOF)
{
makeset(n);
ans = -Mod;
for(i=;i<n-;i++)
{
scanf("%d%d%d",&se[i].u,&se[i].v,&se[i].w);
}
sort(se,se+n-,cmp);
for(i=;i<n-;i++)
unionset(se[i].u,se[i].v,se[i].w);
cout<<ans<<endl;
}
return ;
}
要注意每个地方能转化成同一类型的尽量转化为同一类型,如强制转化为long long,以避免无谓的WA。
ZOJ 3659 & HDU 4424 Conquer a New Region (并查集)的更多相关文章
- hdu 4424 Conquer a New Region (并查集)
///题意:给出一棵树.树的边上都有边权值,求从一点出发的权值和最大,权值为从一点出去路径上边权的最小值 # include <stdio.h> # include <algorit ...
- 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 ...
- HDU 4424 Conquer a New Region
http://acm.hdu.edu.cn/showproblem.php?pid=4424 [题目大意] 给你N个点和N-1条边的连通图,也就是说任意两点间的路径是唯一的.每条边有个权值,从一点到另 ...
- ZOJ3659 Conquer a New Region 并查集
Conquer a New Region Time Limit: 5 Seconds Memory Limit: 32768 KB The wheel of the history roll ...
- zoj 3659 Conquer a New Region(并查集)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4882 代码: #include<cstdio> #inc ...
- HDU 4424 Conquer a New Region 最大生成树
给你一颗树 每条边有一个权值 选择一个点为中心 定义S值为中心到其它n-1个点的路径上的最小边权 求全部点S值的和 从大到小排序 每次合并2棵树 设为A集合 B集合 设A集合的最大S值的和为sumA ...
- ZOJ 3544 / HDU 4056 Draw a Mess( 并查集好题 )
方法参见:http://blog.acmol.com/?p=751 从最后一个线段开始倒着处理(因为之后的线段不会被它之前的线段覆盖),把这条线段所覆盖的所有线段编号合并到一个集合里,并以最左边线段编 ...
- hdu4424 Conquer a New Region 并查集/类似最小生成树
The wheel of the history rolling forward, our king conquered a new region in a distant continent.The ...
- hdu 5458 Stability(树链剖分+并查集)
Stability Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Total ...
随机推荐
- 不变(Invariant), 协变(Covarinat), 逆变(Contravariant) : 一个程序猿进化的故事
阿袁工作的第1天: 不变(Invariant), 协变(Covarinat), 逆变(Contravariant)的初次约 阿袁,早!开始工作吧. 阿袁在笔记上写下今天工作清单: 实现一个scala类 ...
- 批处理清除VisualStudio解决方案文件夹
有很多次我们需要手工来删除bin, obj这样的文件夹.这些文件夹是由Visual Studio编译项目时生成的,其中包括了当前项目的程序集.一个解决方案会包含好多个项目了,那么就有很多这样 ...
- 将32位MD5摘要串转换为128位二进制字符串
将32为MD5摘要串转换为128位二进制字符串: /// <summary> /// 将字符串转成二进制 /// </summary> /// <param name=& ...
- 我所了解的WEB开发(3) - 彩虹的颜色
据说彩虹有七彩颜色,从外至内分别为:红.橙.黄.绿.青.蓝.紫.这些我倒是没有验证过,但是学生时代就不止一次色盲检测,还是让我足够确信对颜色的分辨应该和大多数人相似的. 还听说大多数哺乳动物是色盲.如 ...
- 通过原生js添加div和css
function createStyle(){ return"*{padding:0;margin:0;border:0}.loading{width:640px;height:1024px ...
- Disconnected: No supported authentication methods available (server sent: publickey)
安装Git客户端后,进行PULL时报如下错误 disconnected no supported authentication methods available(server sent: publi ...
- GitHub 基本常用知识解答2
1.如何拥有一个Git仓库的两种途径 (1)在已有的目录中,初始化一个新的. (2) 比如一个新的项目,或者一个已存在的项目,但该项目尚未有版本控制.如果你想要复制一份别人的项目, 或者与别人合作某个 ...
- 彻底退出所有的Acticity
有时候点击回退键退出应用,会出现有些Activity不能完全退出的情况,那么可以使用前面这个方法: 在需要退出的Activity的onCreate()方法中加入 ExitApplication.get ...
- ReactiveCocoa中信号的使用
前言: 很早之前就有看过ReactiveCocoa,那会看的时候知道是一个新的框架关于响应式编程,具体什么也没有深入研究,今天也对ReactiveCocoa这个框架的使用进行了一定的了解.在githu ...
- nginx安装过程,报错处理:make[1]: *** [objs/addon/src/bson.o] Error 1
nginx安装过程中,经常会有各种错误: 具体安装步骤这里不做说明,网上一搜大把: 主要分析安装过程中遇到的问题 在make编译的时候,若报如下错误: cc1: warnings being trea ...