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 ...
随机推荐
- ArrayList、Vector、HashMap、HashTable、HashSet的默认初始容量、加载因子、扩容增量
这里要讨论这些常用的默认初始容量和扩容的原因是: 当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全 ...
- 类库LinqToExcel的介绍
LinqToExcel是一个.net framework平台下开源项目,它主要实现了LINQ的语法查询Excel电子表格.类型之前的LINQToXXX如果你是LINQ语法糖爱好者那最适 ...
- winform(无边框窗体与timer)
一.无边框窗体 1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要放置的控件可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入(pictureBox1_MouseE ...
- 【JavaEE】SSH+Spring Security基础上配置AOP+log4j
Spring Oauth2大多数情况下还是用不到的,主要使用的还是Spring+SpringMVC+Hibernate,有时候加上SpringSecurity,因此,本文及以后的文章的example中 ...
- Ideal-image-slider 幻灯片
在线实例 实例演示 默认效果 实例演示 淡入淡出 实例演示 带链接 实例演示 项目导航 实例演示 带标题描述 实例演示 回调函数 实例演示 自定义切换 使用方法 <div class=" ...
- Office2016体验
Microsoft又迎来了更新的季节.对于我来说,win10就算了,不太稳定,特别是遇到一些专业的程序,因为很多行业软件开发.测试环境都是winxp或win7等:VS2015也安上了,但还没用,一直用 ...
- Android Activity/Service/Broadcaster三大组件之间互相调用
我们研究两个问题,1.Service如何通过Broadcaster更改activity的一个TextView.(研究这个问题,考虑到Service从服务器端获得消息之后,将msg返回给activity ...
- CRM ribbon按钮上引用JS库
在CRM ribbion 按钮上引用 javascript库文件实验,怎么要引用javascript库文件.实验 加载完ribbbion 按钮后立即执行 引用的库文件 (function(){ ale ...
- 强大的UML建模工具——StarUML
用例图: usecase 生成时序图,协作图,活动图等 生成的时序图: 反向工程以及生成代码: 类图: ...
- MySQL数据库中字符集的问题
今天在做Hibernate案例,往mysql中写记录的时候,出现ERROR: Incorrect string value: '\xE5\x8A\xA0\xE5\x86\x85...' for col ...