最小生成树 HihoCoder-1097、1098、1109(最小生成树算法)
太久没写最小生成树了,快忘光了。这几天回顾了一下
- 最小生成树一·Prim算法
AC G++ 369ms 17MB #include "cstdio"
using namespace std;
const int INF = 0x3f3f3f3f;
int road[][];
int dis[], n, ans;
bool vis[];
void prim() {
int v, mn;
for (int i = ; i <= n; i++) {
dis[i] = road[][i];
}
vis[] = true;
for (int i = ; i < n; i++) {
mn = INF;
for (int j = ; j <= n; j++) {
if (!vis[j] && dis[j] < mn) {
mn = dis[j];
v = j;
}
}
ans += dis[v];
vis[v] = true;
for (int j = ; j <= n; j++) {
if (!vis[j] && dis[j] > road[v][j]) {
dis[j] = road[v][j];
}
/*
这个if改成如下写法就变成Dijkstra算法求最短路了
if (!vis[j] && dis[j] > dis[v] + road[v][j]) {
dis[j] = dis[v] + road[v][j];
}
*/
}
}
}
int main() {
scanf("%d", &n);
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
scanf("%d", &road[i][j]);
}
}
prim();
printf("%d\n", ans);
return ;
}理解了Dijkstra看这个就很容易了,改一下if语句多加一个ans就是了;
- 最小生成树二·Kruscal算法
AC G++ 342ms 17MB #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
// 并查集
int pre[];
struct Road{
int s, e, v;
}road[];
bool cmp(Road n, Road m) {
return n.v < m.v;
}
int find(int id) {
if (pre[id] == ) {
return id;
}
return pre[id] = find(pre[id]);
}
int main() {
int n, m, ans = ;
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++) {
scanf("%d%d%d", &road[i].s, &road[i].e, &road[i].v);
}
sort (road, road + m, cmp);
// 用n - 1条边可以联通n个点,所以当n == 1的时候退出循环
for (int i = ; n != ; i++) {
int s = find(road[i].s);
int e = find(road[i].e);
if (s != e) {
pre[s] = e;
n--;
ans += road[i].v;
}
}
printf("%d\n", ans);
return ;
}Kruscal算法有点贪心的意思在里面吧,每次取最短的边,当n个点被联通时退出循环
- 最小生成树三·堆优化的Prim算法
AC G++ 436ms 24MB #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + ;
/*
road[i].first 存放以i为顶点的边的另一个顶点
road[i].second 存放以i为顶点的边的长度
*/
vector<PII> road[MAXN];
int dis[MAXN];
int ans;
bool vis[MAXN];
void prim() {
// q表示就目前状态可以花费q.top.first的代价去联通q.top.second这个点
priority_queue<PII, vector<PII>, greater<PII> > q;
memset(dis, INF, sizeof(dis));
q.push({, });
while (!q.empty()) {
int id = q.top().second;
if (vis[id]) {
// 如果id已经被联通,直接continue
q.pop();
continue;
} else {
// 否则由于优先列队的排序,q.top.first一定是最小代价
ans += q.top().first;
q.pop();
}
vis[id] = true;
for (auto i : road[id]) {
if (i.second < dis[i.first]) {
dis[i.first] = i.second;
q.push({i.second, i.first});
}
}
}
}
int main() {
int n, m;
int u, v, w;
scanf("%d%d", &n, &m);
while (m--) {
scanf("%d%d%d", &u, &v, &w);
road[u].push_back({v, w});
road[v].push_back({u, w});
}
prim();
printf("%d\n", ans);
return ;
}果然还是和dijkstra很像啊,仿照dijkstra的堆优化就好了。这种建图的方法倒是比原先用的链式前向星好写多了。
最小生成树 HihoCoder-1097、1098、1109(最小生成树算法)的更多相关文章
- MST最小生成树及Prim普鲁姆算法
MST在前面学习了Kruskal算法,还有一种算法叫做Prim的.这两者的区别是Prim算法适合稠密图,比如说鸟巢这种几乎所有点都有相连的图.其时间复杂度为O(n^2),其时间复杂度与边的数目无关:而 ...
- 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题
在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...
- 【数据结构】最小生成树之prim算法和kruskal算法
在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种.看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解. 比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优 ...
- 最小生成树——Kruskal(克鲁斯卡尔)算法
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 Kruskal(克鲁斯卡尔)算法 的idea 并用 源代码加以实现: 0.2)最小生成树的基础知识,参见 ...
- hiho一下 第二十九周 最小生成树三·堆优化的Prim算法【14年寒假弄了好长时间没搞懂的prim优化:prim算法+堆优化 】
题目1 : 最小生成树三·堆优化的Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生 ...
- hihocoder 1097 最小生成树一·Prim算法
#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...
- hihoCoder#1109 最小生成树三·堆优化的Prim算法
原题地址 坑了我好久...提交总是WA,找了个AC代码,然后做同步随机数据diff测试,结果发现数据量小的时候,测试几十万组随机数据都没问题,但是数据量大了以后就会不同,思前想后就是不知道算法写得有什 ...
- HihoCoder 1097 Prim算法
1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以 ...
- 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)
最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最 ...
随机推荐
- bfs--奇怪的电梯P1135
计院有一个bug电梯,可能是hyk造的,很多bug,电梯只有两个按钮,“上”和“下”,电梯每层都可以停,每层都有一个数字Ki(0<=Ki<=n),当你在一层楼,你按“上”键会到1+K1层, ...
- TiKV 在京东云对象存储元数据管理的实践
京东云对象存储是在 2016 年作为公有云对外公开的,主要特点是可靠.安全.海量.低成本,应用于包括一些常用的业务场景,比如京东内部的京东商城视频/图片云存储,面向京东云公有云外部的开发者的服务,和面 ...
- java线程——notifyAll通知的泄露
版权声明:本文为CSDN博主「兰亭风雨」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/ns_code/ar ...
- 68)deque数组
基本要求: 1)和vecctor基本区别 示意图 vector在尾部添加和删除, deque在尾部添加和删除,在头部添加和删除. 2)基本知识: 3)deque的构造形式: 4)基本操作和遍历 ...
- MySQL-慢日志slow log
文件结构 1.目录结构 drwxrwxr-x mysql mysql Mar bin drwxrwxr-x mysql mysql Dec : binlogdir -rw-r--r-- mysql m ...
- js操作元素导致元素错位和大小改变
使用js循环的方式批量控制元素的大小时结果往往不尽如人意. 我总结了一条规律 在一个循环体内不可以同时存在一下两种操作,否则容易导致元素错位或大小改变: 1.对元素的offsetWidth.offse ...
- webapp项目vue框架点击按钮实现微信好友分享,朋友圈分享
当时做这个这个效果真把人给*了,网上能搜到的基本是微信页面的分享,特征是方法是wx.**开头,不适用于app内.思路都是一样的,先调取服务(这里使用plus的内置方法),再发送分享请求 <tem ...
- UVa202
刚刚开始写的适合感觉是转换成字符然后开始遍历一遍,后面发现各种不行,就回去看了看题目,重新构思,写了好久还是WA,最后只能看下大神的操作(我太菜了). 先简单梳理下题目意思:首先给出两个数,然后这两个 ...
- Django框架(五):模型(一) 定义属性
1. 定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表创建自动增长的主键列,每个模 ...
- Golang 热编译rizla 插件
今天在写gin接口的时候,每次添加或修改个接口都需要重启项目才能测试,感觉很麻烦. 因为beego有bee工具,bee run启动项目fsnotify会监控文件变动,经查发现在iris项目中有个插件支 ...