The Experience of Love

 Accepts: 11
 Submissions: 108
 Time Limit: 4000/2000 MS (Java/Others)
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
一个叫Gorwin的女孩和一个叫Vivin的男孩是一对情侣。他们来到一个叫爱情的国家,这个国家由NN个城市组成而且只有N-1N−1条小道(像一棵树),每条小道有一个值表示两个城市间的距离。他们选择两个城市住下,Gorwin在一个城市Vivin在另外一个,第一次约会,Gorwin去找Vivin,她会写下路径上最长的一条小道(maxValue),第二次约会,Vivin去找Gorwin,他会写下路径上最短的一条小道(minValue),然后计算maxValue减去minValue的结果作为爱情经验值,再然后重新选择两个城市居住而且计算新的爱情经验值,重复一次又一次。

当他们选择过所有的情况后,请帮助他们计算一下爱情经验值的总和。
输入描述
大约有55组数据在输入文件。
对于每一组测试数据,第一行一个数NN,然后N-1N−1行,每行三个数aa, bb和cc,表示一条小道连接城市aa和城市bb,距离为cc. [参数说明]
1 < N <= 150000,1 <= a, b <= n,1 <= c <= {10}^{9}1<N<=150000,1<=a,b<=n,1<=c<=10​9​​
输出描述
每组测试数据输出一行,输出格式为 Case #x: answer, x表示数据编号,answer表示爱情经验值的总和。
输入样例
3
1 2 1
2 3 2
5
1 2 2
2 3 5
2 4 7
3 5 4
输出样例
Case #1: 1
Case #2: 17
Hint
请注意输入文件较大。

对于第一个样例:
最大值是1最小值是1,当他们选择城市1和2,爱情经验值是0.
最大值是2最小值是2,当他们选择城市2和3,爱情经验值是0.
最大值是2最小值是1,当他们选择城市1和3,爱情经验值是1.
所以爱情经验值的总和就是1。 对于边i,与u相连的点有m个,与v相连的边有n个,如果按权值从小到大排,那么每次都能求得从m个中的一个节点到n个中的一个节点路径的最大值,就是wi,因为之前所处理的所有边权值
都小于wi。反之求最小值也一样。
#include <iostream>
#include <algorithm>
#include <cstdio>
#define LL unsigned long long
using namespace std;
const int Max=+;
int f[Max],num[Max];
struct edge
{
int u,v,w;
}e[Max];
bool cmp1(edge a,edge b)
{
return a.w<b.w;
}
bool cmp2(edge a,edge b)
{
return a.w>b.w;
}
int find(int x)
{
return f[x]==-?x:f[x]=find(f[x]);
}
int main()
{
int n,ca=;
while(~scanf("%d",&n))
{
for(int i=;i<n;i++)
{
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
for(int i=;i<=n;i++) f[i]=-,num[i]=;
sort(e+,e+n,cmp1);
LL maxsum=,t=;
for(int i=;i<n;i++)
{
int pa=find(e[i].u);
int pb=find(e[i].v);
if(pa!=pb)
{
f[pa]=pb; //设pb为pa的父节点
maxsum+=t*num[pa]*num[pb]*e[i].w;
num[pb]+=num[pa]; //那么pa对到pb的节点个数和有所增益
}
}
sort(e+,e+n,cmp2);
LL minsum=;
for(int i=;i<=n;i++) f[i]=-,num[i]=;
for(int i=;i<n;i++)
{
int pa=find(e[i].u);
int pb=find(e[i].v);
if(pa!=pb)
{
f[pa]=pb;
minsum+=t*num[pa]*num[pb]*e[i].w;
num[pb]+=num[pa];
}
}
printf("Case #%d: %I64u\n",ca++,maxsum-minsum);
}
return ;
}

hdu 5176 The Experience of Love的更多相关文章

  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

    这道题以前好像在哪遇到过. 注意树的每一条边都是桥,所以,桥两端的点要到达对方是必须通过这条边的.于是,可以把边由小到大排序,利用并查集,这样,每加一条边就连通了一部分,而随着权值的增大,必定是桥两端 ...

  5. hdu 1086(计算几何入门题——计算线段交点个数)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2 ...

  6. hdu 5326 Work

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5326 Work Description It’s an interesting experience ...

  7. hdu 3642 Get The Treasury

    Get The Treasury http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Othe ...

  8. hdu 3954 线段树 (标记)

    Level up Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. HDU 1808 Halloween treats(抽屉原理)

    题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=1808 Problem Description Every year there is the same ...

随机推荐

  1. [1525] Cow Xor

    问题描述 农民约翰在喂奶牛的时候被另一个问题卡住了.他的所有N(1 <= N <= 100,000)个奶牛在他面前排成一行(按序号1..N的顺序),按照它们的社会等级排序.奶牛#1有最高的 ...

  2. ref 和out的区别

    在C#语言中,参数的传递有两种,一种是值传递,一种是引用传递.ref与out这两种方式都属于引用传递,只是他们的用法稍有不同.下面看几个例子 使用ref的例子 class test { static ...

  3. git期末总结(转载)

    转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137586810169 ...

  4. go多进程

    package main import "fmt" import "time"func loop() { for i := 0; i < 10; i++ ...

  5. Java统计一个字符串中各个字符出现的次数

    相信很多人在工作的时候都会遇到这样一个,如何统计一个字符串中各个字符出现的次数呢,这种需求一把用在数据分析方面,比如根据特定的条件去查找某个字符出现的次数.那么如何实现呢,其实也很简单,下面我贴上代码 ...

  6. tp 3.2 组合查询, 字符串模式查询

    $User = M("User"); // 实例化User对象 $map['id'] = array('neq',1); $map['name'] = 'ok'; $map['_s ...

  7. Effective C++ 深入理解inline

    Effective C++ 深入理解inline inline语义 inline本义是将所调用函数用自身的函数本体替换之,免受函数调用所招致的额外开销,比宏还要不易出错:但是实际上inline的受编译 ...

  8. 设计模式 Singleton 单例 懒汉,线程安全

    首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...

  9. Java继承体系中this的表示关系

    在继承关系下,父类中的this关键字并不总是表示父类中的变量和方法.this关键字的四种用法如前文所述,列举如下. 1) this(paras…); 访问其他的构造方法 2) this.xxx; 访问 ...

  10. 属性字符串(NSAttributedString)的简单应用

    属性字符串NSAttributedString 可以对字符串附加格式信息,由于对于对不同文本片段使用不同的格式,属性字符串类特别合适. IOS 6中对样式文本有了大改善,大部分主要的UIKit控件都允 ...