最小生成树之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座城市中任意两座城市之间建造道 ...
随机推荐
- C++学习之路(八):关于C++提供的强制类型转换
C语言中提供了旧式的强制类型转换方法.比如: int a =1; char *p = (char *)&a; 上述将a的地址单元强制转换为char类型的指针.这里暂且不说上述转换结果是否合理 ...
- Javascript正则表达式详细讲解和示例,通俗易懂
正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 •替换文本.可以在文档中使用一个正则表达式 ...
- JS监控手机或APP返回事件
做微信项目的时候,发现在Ios微信浏览器左上角有个返回按钮,但是点击返回时不稳定,跳到不该跳的页面.网上搜了一个捕获返回事件的JS代码,记录下来,便于以后查看. <span style=&quo ...
- JQuery一个对象绑定多个事件
jQuery("#id").click(func1).mouseover(func2)//方法连写,func为方法的名字 jQuery("#id").click ...
- C#多线程编程之:集合类中Synchronized方法与SyncRoot属性原理分析
我们知道,在.net的一些集合类型中,譬如Hashtable和ArrayList,都有Synchronized静态方法和SyncRoot属性,他们之间有联系吗?我怎么才能用好他们呢? 以Hashtab ...
- IntelliJ IDEA SpringBoot 使用第三方Tomcat以及部署
花了半天时间终于成功,记录以备查阅. 一.第三方Tomcat部署 部署部分参考的是:把spring-boot项目部署到tomcat容器中 目标:把spring-boot项目按照平常的web项目一样发布 ...
- (转载)IntelliJ IDEA 自动导入包 快捷方式
原文地址:IntelliJ IDEA 自动导入包 快捷方式 idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动Alt+Enter设置 设置idea导入包 勾选标注 1 选项,In ...
- windows下github 出现Permission denied (publickey)
github教科书传送门:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 再学习到 ...
- Pygame-依葫芦画瓢之兔獾大战
Pygame-依葫芦画瓢之兔獾大战 前几天看到国外一个12岁的孩子写的兔獾大战游戏,心生敬佩,想当年我还是12岁的时候还不知电脑为何物,连小霸王都未曾玩过.自己也未曾想去搞游戏开发,纯属自娱自乐.在此 ...
- [图解算法]线性时间选择Linear Select——<递归与分治策略>
#include <ctime> #include <iostream> using namespace std; template <class Type> vo ...