最小生成树之Prim算法--蓝白点思想
例题:(cojs)602. 新的开始
★★ 输入文件:newstart.in
输出文件:newstart.out
简单对比
时间限制:1 s 内存限制:128 MB
【题目描述】
发展采矿业当然首先得有矿井, 小 FF 花了上次探险获得的千分之一的财富请人在岛
上挖了 n 口矿井, 但他似乎忘记考虑的矿井供电问题……
为了保证电力的供应, 小 FF 想到了两种办法:
1、 在这一口矿井上建立一个发电站, 费用为 v(发电站的输出功率可以供给任
意多个矿井)。
2、 将这口矿井与另外的已经有电力供应的矿井之间建立电网, 费用为 p。
小 FF 希望身为”NewBe_One" 计划首席工程师的你帮他想出一个保证所有矿井电力供
应的最小花费。
【输入格式】
第一行一个整数 n, 表示矿井总数。
第 2~n+1 行,每行一个整数, 第 i 个数 v[i]表示在第 i 口矿井上建立发电站的费用。
接下来为一个 n*n 的矩阵 P, 其中 p[ i , j ]表示在第 i 口矿井和第 j 口矿井之间建立
电网的费用(数据保证有 p[ i, j ] = p[ j, i ], 且 p[ i, i ]=0)。
【输出格式】
仅一个整数, 表示让所有矿井获得充足电能的最小花费。
【输入样例】
4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
【输出样例】
9
输出样例说明:
小 FF 可以选择在4号矿井建立发电站然后把所有矿井都与其建立电网,总花费是
3+2+2+2 = 9。
【数据范围】
对于30%的数据: 1<=n<=50;
对于100%的数据: 1<=n<=300; 0<=v[i], p[i,j] <=10^5.
/*先加点,再跑最小生成树*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#define INF (1<<31)-1
#define N 621
int n;
struct Edge{
int v,w,last;
};
Edge edge[N*N];
int t=;
int head[N],miu[N];
bool flag[N];
long long int mst=;
void input()
{
scanf("%d",&n);
int a;
for(int i=;i<=n;++i)
{
scanf("%d",&a);
++t;
edge[t].v=i;
edge[t].w=a;
edge[t].last=head[n+];
head[n+]=t;
++t;
edge[t].v=n+;
edge[t].w=a;
edge[t].last=head[i];
head[i]=t;
}
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
{
scanf("%d",&a);
++t;
edge[t].v=j;
edge[t].w=a;
edge[t].last=head[i];
head[i]=t;
}
n+=;
}
void Prim()
{
mst=;
memset(miu,,sizeof(miu));
miu[n]=;/*从第n个点开始建树*/
memset(flag,false,sizeof(flag));
int p,maxx=INF;
for(int i=;i<=n;++i)
{
maxx=INF;
for(int j=;j<=n;++j)
{/*!flag[j],找出miu最小的蓝点p*/
if(!flag[j]&&miu[j]<maxx)
{
maxx=miu[j];
p=j;
}
}
flag[p]=true;/*标记*/
mst+=miu[p];/*把p加入树内*/
for(int l=head[p];l;l=edge[l].last)
{
int vi=edge[l].v;
if(!flag[vi]&&edge[l].w<miu[vi])
miu[vi]=edge[l].w;/*miu储存着蓝点vi到白点的最小距离*/
}
}
}
int main()
{
freopen("newstart.in","r",stdin);
freopen("newstart.out","w",stdout);
input();
Prim();
cout<<mst<<endl;
fclose(stdin);
fclose(stdout);
return ;
}
Prim算法
最小生成树之Prim算法--蓝白点思想的更多相关文章
- 数据结构(C实现)------- 最小生成树之Prim算法
[本文是自己学习所做笔记.欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020] 算法描写叙述 假设连通图是一个网,则称该网中全部生成树中权值总和最小的生成树 ...
- 数据结构与算法--最小生成树之Prim算法
数据结构与算法--最小生成树之Prim算法 加权图是一种为每条边关联一个权值或称为成本的图模型.所谓生成树,是某图的一棵含有全部n个顶点的无环连通子图,它有n - 1条边.最小生成树(MST)是加权图 ...
- 24最小生成树之Prim算法
最小生成树的Prim算法 思想:采用子树延伸法 将顶点分成两类: 生长点——已经在生成树上的顶点 非生长点——未长到生成树上的顶点 使用待选边表: 每个非生长点在待选边表中有一条待选边,一端连着非生长 ...
- 最小生成树的Prim算法
构造最小生成树的Prim算法 假设G=(V,E)为一连通网,其中V为网中所有顶点的集合,E为网中所有带权边的集合.设置两个新的集合U和T,其中集合U用于存放G的最小生成树的顶点,集合T用于 ...
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
还是畅通工程 Time Limit: 4000/2 ...
- 算法学习记录-图——最小生成树之prim算法
一个连通图的生成树是一个极小的连通子图,它包含图中全部的顶点(n个顶点),但只有n-1条边. 最小生成树:构造连通网的最小代价(最小权值)生成树. prim算法在严蔚敏树上有解释,但是都是数学语言,很 ...
- Hihocoder 之 #1097 : 最小生成树一·Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)
#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...
- C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)
1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...
- 最小生成树一·Prim算法
描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道 ...
随机推荐
- 转 Wireshark和TcpDump抓包分析心得
1. Wireshark与tcpdump介绍 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话 ...
- js中的return
retrun true: 返回正确的处理结果. return false:分会错误的处理结果,终止处理. return:把控制权返回给页面(如果条件满足,后面的逻辑就不执行了). if(this.in ...
- python基础===Excel处理库openpyxl
openpyxl是一个第三方库,可以处理xlsx格式的Excel文件. 安装: pip install openpyxl 对如下excel进行读取操作,如图: from openpyxl import ...
- python基础===python os.path模块
os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...
- perl_nc.pl
#!/usr/bin/perl use strict; use IO::Socket; use IO::Select; use Getopt::Std; my %option;getopts('lp: ...
- #error This file was generated by a newer version of protoc
pattern@pattern89:/raid0/workspace/houjun/caffe-ssd$ sudo make all -j8PROTOC src/caffe/proto/caffe.p ...
- MyBatis根据数组、集合查询
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.it ...
- MUI 页面刷新及页面传值问题
一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面A代码 window.addEventListener("pageflowrefre ...
- J2EE MySQL Date数据保持一致解决方案
1.设置MySQL时区,明确指定 MySQL 数据库的时区,不使用引发误解的 CST show variables like '%time_zone%';set global time_zone = ...
- Dubbo 用户手册学习笔记 —— Dubbo架构
Dubbo的架构 节点角色说明 节点 角色说明 Provider 服务提供方 Consumer 服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数和调用时间的监 ...