宿命的PSS

题目描述

最小生成树P.S.S在宿命的指引下找到了巫师Kismi。P.S.S希望Kismi能帮自己变成一个完全图。Kismi由于某些不可告人的原因,把这件事交给了你。 PS:  可以保证,这个最小生成树对于最后求出的完全图是唯一的。

输入

输入的第一行是一个整数n,表示生成树的节点数。 接下来有n-1行,每行有三个正整数,依次表示每条边的端点编号和边权。 (顶点的边号在1-n之间,边权< maxint)

输出

一个整数ans,表示以该树为最小生成树的最小完全图的边权之和。

样例输入

3

1 2 4

2 3 7

样例输出

19

提示

n< 20000

这一道题目的意思就是给你一棵最小生成树的构造,求原来的完全图的总权值之和。那么有最小生成树的性质可知,我们选取的一定是最小的边,我们这一题最好使用克鲁斯卡尔,因为我们需要判断选取的点是否属于一个集合,如果不属于这个集合,按照道理来说,我们需要加入这个最小生成树,但是我们这里不能这么干,因为图中已经给出了真正的最小生成树,所以这一条边的权值是可以计算出来的。

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6
 7 using namespace std;
 8
 9 struct node
10 {
11     int u,v;
12     long long cost;
13 };
14
15 node a[100005];
16 int f[100005];
17 int N;
18 int Len=0;
19 long long d[100005];
20
21 bool cmp(node i,node j)
22 {
23     return i.cost < j.cost;
24 }
25
26 int find(int X)
27 {
28     if (f[X] != X) f[X]=find(f[X]);
29     return f[X];
30 }
31
32 int main()
33 {
34     int M,K;
35     scanf("%d",&N);
36     for (int i=1; i<=N; i++)
37     {
38         f[i]=i;
39         d[i]=1;
40     }
41     for (int i=1; i<=N-1; i++)
42     {
43         scanf("%d%d%lld",&a[i].u,&a[i].v,&a[i].cost);
44     }
45     long long ans=0;
46     int total=0;
47     sort(a+1,a+N,cmp);
48     for (int i=1; i<=N-1; i++)
49     {
50         int fx=find(a[i].u);
51         int fy=find(a[i].v);
52         if (fx > fy) swap(fx,fy);
53         if (fx == fy) continue;
54         if (fx != fy)
55         {
56             f[fy]=fx;
57             ans+=(a[i].cost + 1) * d[fx] * d[fy];
58             d[fx]+=d[fy];
59         }
60     }
61     printf("%lld\n",ans - N + 1);
62 }

Show My Ugly Code

时间: 2024-11-05 02:40:55

宿命的PSS的相关文章

Vijos1579 宿命的PSS 最小生成树

转载一下YH大佬的blog地址http://blog.csdn.net/jokercold .. 直译小丑严寒2333 以及HK大佬 http://blog.csdn.net/yuyaohekai 宿命的PSS 题目描述 最小生成树P.S.S在宿命的指引下找到了巫师Kismi.P.S.S希望Kismi能帮自己变成一个完全图.Kismi由于某些不可告人的原因,把这件事交给了你. PS:  可以保证,这个最小生成树对于最后求出的完全图是唯一的. 输入 输入的第一行是一个整数n,表示生成树的节点数.

[最小生成树]vijos1579 宿命的PSS

题目梗概 输入给出最小生成树,由最小生成树求出最小完全图(任意两点之间只有一条线段相连). 思考 首先一个图中最小生成树,按照kruskal算法.一定是使图连通的最小边.我们设这两点的边权为W,那么与两点相连的其他的边一定是W+1. 所以构建方法是 每次选出图中最短的边,其两点标记为A,B,边权为W,则与A,B连通的点边权修改为W+1. #include <cstdio> #include <algorithm> typedef long long ll; int n; ll nu

Linux内存VSS,RSS,PSS,USS解析

转载:http://myeyeofjava.iteye.com/blog/1837860 adb shell procrank | grep com.package > appmem说明:五个参数分别为PID Vss Rss Pss Uss 一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)RSS - Resident Set Size 实际使用物理内存(包含共享库占用

互联网健身都推“按次付费”了,传统健身房“年卡”宿命般解体?

互联网健身行业经历了前两年O2O和"24小时自助健身"模式后,"碎片化付费"模式正成为行业热潮. 精品健身工作室和自助健身房,是"碎片化付费"模式的两大代表.精品健身工作室主打"按次预约",自助健身房主推"低价月卡",精明的健身用户被"碎片化付费"模式不断教育,传统健身房的"年卡预售"模式正遭遇危机--"健身的人越来越多了,但也越来越聪明了". &

VSS、RSS、PSS、USS

VSS:Virtual Set Size,虚拟耗用内存.它是一个进程能访问的所有内存空间地址的大小.这个大小包含了一些没有驻留在RAM中的内存,就像mallocs已经被分配,但还没有写入.VSS很少用来测量程序的实际使用内存. RSS:Resident Set Size,实际使用物理内存.RSS是一个进程在RAM中实际持有的内存大小.RSS可能会产生误导,因为它包含了所有该进程使用的共享库所占用的内存,一个被加载到内存中的共享库可能有很多进程会使用它.RSS不是单个进程使用内存量的精确表示. P

android内存耗用:VSS/RSS/PSS/USS

VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)  不是真实当前应用进程所占用的内存. 内存分配的原理 从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存). 1.brk是将数据段(.data)的最高地址指针_edata往高地址推: 2.mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存.      这两种方式分配的都是虚拟内存,没有分配物理内存.在第一次访问已分配的虚拟地址

进程内存--pss

一般看进程的内存占用情况,就看pss. 那么pss是什么意思呢?因为有一些内存是多个进程共享的,我们计算的时候如果把这些计算进去进程的内存占用,显然会多算. pss的意思是进程自己独自占有的+共享的/共享的数目. 因此如果进程有自己独立的内存100M,和另外一个进程共享10M. 那么pss就是100 + 10/2=105

[转]Android中内存占用的含义:(VSS,PSS,RSS,USS)

Android中内存占用的含义:(VSS,PSS,RSS,USS) 作者: andforce 分类: 安卓系统 发布时间: 2013-09-07 00:03 ?1,915 浏览数 6没有评论 在eng版本的android手机上,可以执行:procrank 会列出来VSS,PSS,RSS,USS的占用信息. VSS:Virtual Set Size:how virtual memory associated witth process.([共享]进程所占的虚拟内存是多少,跟物理内存没有多大关心.)

内存VSS/RSS/PSS/USS名词解释

VSS(virtual set size)虚拟耗用内存(包含共享库占用的内存) RSS(Resident set size)实际使用物理内存(包含共享库占用的内存) RSS是进程实际驻存在物理内存的部分的大小.因为一个进程执行不需要把整个进程都全部驻存到物理内存.RSS是最常用的内存指标,表示进程占用的物理内存大小.但是,将各进程的RSS值相加,通常会超出整个系统的内存消耗,这是因为RSS中每个进程都包含了各进程间共享的内存,因此存在重叠部分. VSS是一个进程的总的大小.只有当进程执行且整个进