这道题以前好像在哪遇到过。

注意树的每一条边都是桥,所以,桥两端的点要到达对方是必须通过这条边的。于是,可以把边由小到大排序,利用并查集,这样,每加一条边就连通了一部分,而随着权值的增大,必定是桥两端到达对方经过的最大的边。于是总的权为左边集合数*右边集合数*桥的权值,就可以求出最大值和了。求最小值和相同。两者相减即为结果。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cctype>
#include <algorithm>
#define LL unsigned __int64
using namespace std; const int N=150100; int pre[N];
LL cnt[N];
struct Edge{
int u,v;
LL c;
}edge[N];
bool cmp1(Edge a,Edge b){
if(a.c>b.c) return true;
return false;
}
bool cmp2(Edge a,Edge b){
if(a.c<b.c) return true;
return false;
} int n; int findr(int u){
int r,t=u;
while(pre[t]!=-1){
t=pre[t];
}
r=t;
while(u!=r){
t=pre[u];
pre[u]=r;
u=t;
}
return r;
} int main(){
int t=0;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n-1;i++){
scanf("%d%d%I64u",&edge[i].u,&edge[i].v,&edge[i].c);
}
for(int i=1;i<=n;i++){
pre[i]=-1,cnt[i]=1;
}
LL ans_max=0,ans_min=0;
int u,v;
sort(edge,edge+n-1,cmp2);
for(int i=0;i<n-1;i++){
u=findr(edge[i].u),v=findr(edge[i].v);
ans_max+=(cnt[u]*cnt[v]*edge[i].c);
if(cnt[u]>cnt[v]){
pre[v]=u;
cnt[u]+=cnt[v];
}
else {
pre[u]=v;
cnt[v]+=cnt[u];
}
}
for(int i=1;i<=n;i++){
pre[i]=-1,cnt[i]=1;
}
for(int i=n-2;i>=0;i--){
u=findr(edge[i].u),v=findr(edge[i].v);
ans_min+=(cnt[u]*cnt[v]*edge[i].c);
if(cnt[u]>cnt[v]){
pre[v]=u;
cnt[u]+=cnt[v];
}
else {
pre[u]=v;
cnt[v]+=cnt[u];
}
}
printf("Case #%d: %I64u\n",++t,ans_max-ans_min);
}
return 0;
}

  

HDU 5176的更多相关文章

  1. Valentine's Day Round hdu 5176 The Experience of Love [好题 带权并查集 unsigned long long]

    传送门 The Experience of Love Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  2. HDU 5176 The Experience of Love 带权并查集

    The Experience of Love Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  3. hdu 5176(并查集)

    The Experience of Love Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  4. hdu 5176 The Experience of Love

    The Experience of Love  Accepts: 11  Submissions: 108  Time Limit: 4000/2000 MS (Java/Others)  Memor ...

  5. HDU 1081 To The Max【dp,思维】

    HDU 1081 题意:给定二维矩阵,求数组的子矩阵的元素和最大是多少. 题解:这个相当于求最大连续子序列和的加强版,把一维变成了二维. 先看看一维怎么办的: int getsum() { ; int ...

  6. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  8. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  9. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

随机推荐

  1. HDU1560 DNA sequence

    题目: The twenty-first century is a biology-technology developing century. We know that a gene is made ...

  2. 【Python小试牛刀】循环

    1.斐波那契数列 斐波那契数列,数列前两项为1,之后每一项都是前两项之和. #!/usr/bin/env python3 a, b = 0, 1 while b < 100: print(b) ...

  3. JavaScript学习三

    2019-05-30 20:38:50 逻辑运算符 && || ! !如果对非布尔值取反,则将会把数值变成布尔值,然后再取反 隐式类型转化 为任意的数据类型做两次非运算,既可将其转换成 ...

  4. 修改DIV滚动条样式

    /*滚动条样式*/ div::-webkit-scrollbar { /*滚动条整体样式*/ width: 5px; /*高宽分别对应横竖滚动条的尺寸*/ height: 5px; } div::-w ...

  5. DotnetCore安装介绍

    微软的DotnetCore发布至今,已经有段时间了,我们都非常关注我们它能为我们带来什么,我们能通过它做什么?要解决这些问题,不仅仅需要基本的了解意外,还需要知道是开发环境是怎么搭建的,接下来我们就一 ...

  6. golang struct里面的字段,或者slice排序

    accounts := []users.Account{}Admin.DB.Preload("CurrencyObj").Where("member_id = ?&quo ...

  7. MySQL安装for windows

    ======MySQL安装 for windows====== 版本5.7.X MySQL服务器帮助我们来管理文件的操作 MySQL软件 - 服务器端软件 - 服务端程序 - 解析指令 - 对文件的操 ...

  8. IDEA 使用 git (码市)

    1.下载 git,并安装(一直下一步) 2.使用IDEA,检出项目,检出方式选择:git, 3.如果项目有修改,上传修改的文件 4.下载 SourceTree(git的图形化工具),并安装(一直下一步 ...

  9. 5.17 Quartz笔记

    有用到构建者模式: builder---JobDetail相当于需要构建者构建出来的一个配件:JobDetail为Job实例提供了许多设置属性,以及JobDetaMap成员变量属性,它用来存储特定Jo ...

  10. Laravel5.1 学习笔记1, 目录结构和命名空间(待修)

    自从用 Laravel4做了个小网站,使用了数据库ORM Eloquent, 就放下了一段时间,想不到这个与Asp.net MVC 有着异曲同工之妙的框架已经出了下个版本,而且还有不小的改动,因此不得 ...