代码随想录算法训练营第五十七天 | 图论part07

devtools/2024/12/22 22:15:04/

53. 寻宝 prim算法

prim算法

#include <iostream>
#include <vector>
#include <fstream>
#include <climits>using namespace std;int main() {int v, e;int v1, v2, val;ifstream infile("input.txt");cin >> v >> e;vector<vector<int>> graph(v + 1, vector<int>(v + 1, INT_MAX));while (e--) {cin >> v1 >> v2 >> val;graph[v1][v2] = val;graph[v2][v1] = val;}/*for (int i = 0; i < v + 1; ++i) {for (int j = 0; j < v + 1; ++j) {cout << "v1: " << i << " v2: " << j << " val: " << graph[i][j] << endl;}}*/vector<bool> isInTree(v + 1, false);vector<int> minDest(v + 1, INT_MAX);// 找到第一个顶点// 将它放入树中// 更新minDestisInTree[1] = true;for (int j = 1; j < v + 1; ++j) {if (!isInTree[j] && graph[1][j] < minDest[j])minDest[j] = graph[1][j];}for (int i = 2; i < v; ++i) { // 只需要循环v-1次int curMin = 0;int minVal = INT_MAX;for (int j = 1; j < v + 1; ++j) {if (!isInTree[j] && minDest[j] < minVal) {minVal = minDest[j];curMin = j;}}isInTree[curMin] = true;for (int j = 1; j < v + 1; ++j) {if (!isInTree[j] && graph[curMin][j] < minDest[j])minDest[j] = graph[curMin][j];}}int result = 0;for (int i = 2; i <= v; ++i) {result += minDest[i];}cout << result << endl;return 0;
}

kruskal算法

算法思路是按边的val进行从小到大的排序,在不出现环的情况下,将这个边作为最小完全树的一部分。

#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>using namespace std;struct Edge {int v1, v2, val;
};void init(vector<int>& father) {for (int i = 0; i < father.size(); ++i) {father[i] = i;}
}int find(vector<int>& father, int u) {if (father[u] == u) return u;return father[u] = find(father, father[u]);
}bool same(vector<int>& father, int u, int v) {u = find(father, u);v = find(father, v);if (u == v) return true;else return false;
}void join(vector<int>& father, int u, int v) {u = find(father, u);v = find(father, v);if (u == v) return;else father[v] = u;
}int main() {int v, e;int v1, v2, val;ifstream infile("input.txt");cin >> v >> e;vector<Edge> edges;while (e--) {cin >> v1 >> v2 >> val;edges.emplace_back(Edge{v1, v2, val});}/*for (int i = 0; i < v + 1; ++i) {for (int j = 0; j < v + 1; ++j) {cout << "v1: " << i << " v2: " << j << " val: " << graph[i][j] << endl;}}*/vector<int> father(v + 1, 0);sort(edges.begin(), edges.end(), [](const Edge &a, const Edge &b) {return a.val < b.val;});init(father);int result = 0;for (Edge edge : edges) {if (!same(father, edge.v1, edge.v2)) {join(father, edge.v1, edge.v2);result += edge.val;}}cout << result << endl;return 0;
}

http://www.ppmy.cn/devtools/107429.html

相关文章

CrowdStrike 的失败如何凸显了左移测试的重要性

通过自动化软件测试并将其左移&#xff0c;组织可以显著降低 CrowdStrike 等事件发生的风险。继续阅读&#xff0c;了解采用左移测试方法的强大之处。 Parasoft下载 测试中偷工减料的风险 CrowdStrike 软件更新失败是一个重要的教训&#xff0c;它让我们认识到早期、自动…

WordShield 一款轻量级且灵活的敏感词过滤库

简介 WordShield 是一款轻量级且灵活的敏感词过滤库&#xff0c;基于 Spring Boot 构建。它提供了简单易用的 API&#xff0c;用于过滤和管理敏感词汇。 github 地址&#xff1a; https://github.com/avidbyte/wordshield 特性 敏感词过滤&#xff1a;自动过滤字符串中的敏…

CargosettlementController

目录 1、 CargosettlementController 1.1、 货商结算 1.1.1、 //登录用户 1.2、 结算单号 1.2.1、 //查询供应商账单 1.2.2、 //单号 1.2.3、 //单据日期 1.2.4、 //付款状态 CargosettlementController using QXQPS.Models; using QXQPS.Vo; using System…

使用Natapp内网穿透工具,将内网地址映射为外网地址

最近由于项目需要&#xff0c;测试小程序在手机端的显示效果&#xff0c;自己电脑本地的内网地址访问不到&#xff0c;所以需要将内网地址映射为外网地址&#xff0c;这样外网就能访问我的内网项目地址了。 路由器映射成功之后发现不是公网ip&#xff0c;外网无法访问。在网上…

MySQL5.7.36之高可用架构部署-Atlas读写分离

1、安装Atlas-2.2.1.el6.x86_64.rpm rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 2、进入Atlas目录并且备份配置文件 cd /usr/local/mysql-proxy/conf cp test.cnf test.cnf.bak 3、密码加密采用的是自带的工具 /usr/local/mysql-proxy/bin/encrypt 123456 #因为我的密码是12345…

JVM运行时数据区

JVM运行时数据区 1.概述 内存是非常重要的系统资源&#xff0c;是硬盘和CPU 的中间仓库及桥梁承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略&#xff0c;保证了JVM的高效稳定运行不同的JVM对于内存的划分方式和管理机制…

2408wtl,解析快捷方式

原文 介绍 快捷方式是扩展名为每个文件都包含一个另一个文件的特殊COM对象的.lnk的文件. 一般,试打开.lnk文件时,系统会打开此快捷方式指向文件. 以下实验.在某处创建一个(扩展名为.txt的文件)文本文件.然后创建一个此文件的快捷方式. 然后试用字打开快捷方式,使用File->…

进程的那些事——了解进程(虚拟地址空间)

目录 前言 一、程序地址空间&#xff08;虚拟地址空间&#xff09; 二、虚拟地址寻找物理内存 1.页表 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 程序和进程之间的区别&#xff1a; 进程&#xff1a;对用户而言&#xff0c;进程是运行中的…