07:清泉-改(prime+堆)

时间限制: 
10000ms

单个测试点时间限制: 
1000ms

内存限制: 
512000kB
描述

华北电力大学可以抽象为一张有n个点m条边的无向图.

现在所有的边都断了. 修复每条边都有个不同的代价w_i.

求让所有点都能互相到达的最小代价和.

输入
第一行两个正整数 n, m 表示顶点数和边数

接下来m行每行三个正整数 u v w 表示一条边 (u和v是边的端点, w是边权)

输出
输出一行一个正整数表示答案
样例输入
2 2
1 2 2
2 1 3
样例输出
2
提示
n ≤ 10^5, m ≤ 3*10^5, w ≤ 10^4 保证有解
来源
laekov

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 const int MAXN=1200001;
 8 const int maxn=0x3f;
 9 void read(int &n)
10 {
11     char c=‘+‘;int x=0;bool flag=0;
12     while(c<‘0‘||c>‘9‘){c=getchar();if(c==‘-‘)flag=1;}
13     while(c>=‘0‘&&c<=‘9‘)
14     x=(x<<1)+(x<<3)+c-48,c=getchar();
15     flag==1?n=-x:n=x;
16 }
17 struct node
18 {
19     int u,v,w,nxt;
20 }edge[MAXN];
21 int head[MAXN];
22 int num=1;
23 int add_edge(int x,int y,int z)
24 {
25     edge[num].u=x;
26     edge[num].v=y;
27     edge[num].w=z;
28     edge[num].nxt=head[x];
29     head[x]=num++;
30 }
31 int n,m;
32 int vis[MAXN];
33 int dis[MAXN];
34 struct pr
35 {
36     int p,v;
37     pr()
38     {p=v=0;}
39     pr(int a,int b)
40     {p=a;v=b;}
41     bool operator<(const pr&a)const
42     {return v>a.v;}
43 }inc;
44 void prime()
45 {
46     //vis[1]=1;
47     priority_queue<pr>q;
48     memset(dis,maxn,sizeof(dis));
49     dis[1]=0;
50     q.push(pr(1,0));
51     int ans=0;
52 //    for(int i=head[1];i!=-1;i=edge[i].nxt)
53 //        q.push(pr(edge[i].v,edge[i].w));
54
55     for(int k=1;k<=n;k++)
56     {
57         int pos;
58         while(vis[q.top().p]&&q.size()>=0)
59             q.pop();
60
61         pos=q.top().p;
62         vis[pos]=1;
63         ans+=dis[pos];
64         for(int i=head[pos];i!=-1;i=edge[i].nxt)
65             if(vis[edge[i].v]==0&&dis[edge[i].v]>edge[i].w)
66             {
67                 dis[edge[i].v]=edge[i].w;
68                 q.push(pr(edge[i].v,edge[i].w));
69             }
70
71     }
72     printf("%d",ans);
73 }
74 int main()
75 {
76     read(n);read(m);
77     memset(head,-1,sizeof(head));
78     for(int i=1;i<=m;i++)
79     {
80         int x,y,z;
81         read(x);read(y);read(z);
82         add_edge(x,y,z);
83         add_edge(y,x,z);
84     }
85     prime();
86     return 0;
87 } 

时间: 2024-10-11 00:00:47

07:清泉-改(prime+堆)的相关文章

基本数据结构之堆

堆的定义 堆是一个完全二叉树或者近似的完全二叉树 堆的性质 父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2.它的左右子结点下标分别为2 * i + 1和2 * i + 2 堆的特点 插入元素和弹出堆顶元素的时间复杂度lg(n) 判断序列是不是堆 根据性质判断 比如输入序列15,30,22,93,52,71,89,15是根节点,可以看出满足性

十准二新老动所按养十规

打开地图显示的名称是龙域 当我将毒牙放在鉴定桌上的时候那中级鉴定师立刻微微惊诧随即道鉴定费金币 大步上前抬头一个冰风刺解决掉一名级弓箭手另外的几个弓箭手立刻吓得面无人色道这个人的攻击太变态了谁能挡住他魔法师魔法师用火球术齐射 成功了我惊喜交加十分钟的时间已经足够我做很多事情了当我将的属性共享在队伍里的时候凌月不由得神色一凛道大家小心点了这个的攻击力好高 扯窃耐沦脊辆俸彰圆尤谫缘http://p.baidu.com/ihome/center?uid=314c6162633632373230333d

POJ1258 基础最小生成树

本文出自:http://blog.csdn.net/svitter 题意:给出一个数字n代表邻接矩阵的大小,随后给出邻接矩阵的值.输出最小生成树的权值. 题解: prime算法的基本解法: 1.选择一个点,然后不停的向其中加入权值最小的边,边的一端在已经生成的部分生成树中,另一端在未生成的生成树中. 2.利用优先队列维护边,将加入的点所包含的边加入到队列中去,随后按照边的权值弹出. 简单理解方法:一个人可以拉很多人,新被拉进来的人,把能拉的人(有边,且未被访问)排队,找最好拉的人拉进来,循环.

BZOJ4010 HNOI2015 菜肴制作 拓扑排序+贪心

题意:给定限制条件(a,b)表示a必须在b之前,求所有合法序列中,小的数尽量在前面的方案 题解:首先我们根据限制条件建反向图,然后在反向图上求字典序最小的拓扑序(队列改为堆),逆序输出即可. #include <queue> #include <functional> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include

排序再学习 - 冒泡、快速、归并、堆排序

1. 冒泡排序 每次比较数组中的两个数,如果和你期望的顺序不一致,就交换这两个数,一次循环下来能将一个数摆在正确的位置上.外层循环共需要N-1次,因为N-1个数都已经摆在正确的位置上,那第N个数也已经是正确的了.内层循环也可以是N-1次,也可以每次都比上一次少循环一次,第一种情况会比较已经排好序的部分,第二种情况已经排序过的部分不需要再比较了.还是两层循环都是N-1次比较好写. void bubble_sort(int array[], int n) { int i, j, temp; for

北大ACM暑期培训课程目录(三)

本文出自:http://blog.csdn.net/svitter 一.图的生成树 .必然含有n-1条边. .无向带权图. .如何求最小生成树. .prime | kruskal Prime: 从点里面找一个最短的边. kruskal: 从边里面找. .密集图使用邻接矩阵来存储. .稀疏图用邻接表来存储. .开一个邻接表,一个vector的一维数组. 时间复杂度(ElogV) 一般情况下邻接表更加优秀 题目:poj1258(邻接矩阵) 使用prime+堆完成.priority_queue(就是二

JavaScript筑基篇(二)-&gt;JavaScript数据类型

说明 介绍JavaScript数据类型 目录 前言 参考来源 前置技术要求 JavaScript的6种数据类型 哪6种数据类型 undefined 类型 null 类型 boolean 类型 number 类型 string 类型 复杂 类型 基本型和引用型的不同 关于数据类型的一些常见疑问 为什么typeof null === 'object' string,String,object,Object,function,Function的关系 关于String类型与string类型的疑问 fun

JavaScript筑基篇(一)-&gt;变量、值与对象

JavaScript变量.值与对象 说明 JavaScript中变量.值.对象的理解.本文为了简化理解,前半部分暂时刨除与执行上下文的相关概念.另外本文是个人的见解,如有疑问或不正支持,欢迎提出指正和讨论! 目录 前言 参考来源 变量与值 区分变量与值 JS值的两大类型 堆内存与栈内存的区别 值与对象 结合执行上下文理解 前言 参考来源 前人栽树,后台乘凉,本文参考了以下来源 汤姆大叔:变量对象 变量与值 区分变量与值 和所有其它程序语言一样,JavaScript也有变量和值得概念 var a

课程2,阶段一,绘图纸上的任务(不用电脑)

https://code.org/curriculum/course2/1/Teacher#Shmocab 原文 (翻译 clock_JZ) 不用电脑 纸上编程 课程时间: 20 分钟         该时间只包括基本活动. 时间充裕的情况下,可以加入课前介绍及课后思考和拓展 课程概述 通过在图纸上计划并完成一系列图像,学生可以了解编程到底是做什么. 学生们要想办法在格子里填充颜色,重构一些目标图像. 如果时间容许,可以让学生发挥,制作他们自己的图像. 教学计划 开始 - 15分钟 1) 单词