算法训练营第七十天 | 最小生成树之prim、最小生成树之Kruskal、拓扑排序

算法训练营第七十天

最小生成树之prim

题目链接:https://kamacoder.com/problempage.php?pid=1053


在这里插入图片描述

  • 随意将一个节点放入set作为初始状态。每次从和set中节点相连的权值最小的边相连的节点放入并记录权值。直到set大小和节点数相同。

代码如下:

#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std; 
int main() {
    int m, n, s, t;
    cin >> n >> m;
    vector<int> inDegree(n, 0); // 记录每个文件的入度
      
    unordered_map<int, vector<int>> umap;// 记录文件依赖关系 
    vector<int> result; // 记录结果
      
    while (m--) {
        // s->t,先有s才能有t
        cin >> s >> t;
        inDegree[t]++; // t的入度加一
        umap[s].push_back(t); // 记录s指向哪些文件
    } 
    queue<int> que;
    for (int i = 0; i < n; i++) {
        // 入度为0的文件,可以作为开头,先加入队列
        if (inDegree[i] == 0) que.push(i);  
        //cout << inDegree[i] << endl;
    }
    // int count = 0;
    while (que.size()) {
        int  cur = que.front(); // 当前选中的文件 
        que.pop();
        //count++;
        result.push_back(cur);
        vector<int> files = umap[cur]; //获取该文件指向的文件 
        if (files.size()) { // cur有后续文件
            for (int i = 0; i < files.size(); i++) {
                inDegree[files[i]] --; // cur的指向的文件入度-1
                if(inDegree[files[i]] == 0) que.push(files[i]);
            }
        }
    }
    if (result.size() == n) {
        for (int i = 0; i < n - 1; i++) cout << result[i] << " ";
        cout << result[n - 1];
    } else cout << -1 << endl;
      
      
}

最小生成树之Kruskal

题目链接:https://kamacoder.com/problempage.php?pid=1191
在这里插入图片描述
在这里插入图片描述

  • 用到了并查集,每次对两个节点不连通的情况进行处理,记录最小权值的边。之后对两个节点使用并查集中的join,直到没有不连通的节点

代码如下:

#include <iostream>
#include <vector>

using namespace std;

int father[10001];

void init() {
    for (int i = 0; i <= 10000; i++) father[i] = i;
}

int find(int a) {
    while (father[a] != a) {
        a = father[a];
    }
    return a;
}

bool isSame(int a, int b) {
    a = find(a);
    b = find(b);
    return a == b;
}

void join(int a, int b) {
    if (isSame(a, b)) return;
    father[find(a)] = b;
    return;
}

int main() {
    int v, e;
    cin >> v >> e;
    vector<vector<int>> edges(e, vector<int>(3, 0));
    for (int i = 0; i < e; i++) {
        for (int j = 0; j < 3; j++) {
            cin >> edges[i][j];
        }
    }
    int dis = 0;
    init();
    bool flag = true;
    while (flag) {
        flag = false;
        int min = 10000;
        int minIndex = -1;
        for (int i = 0; i < e; i++) {
            if (isSame(edges[i][0], edges[i][1])) continue;
            flag = true;
            if (min > edges[i][2]) {
                min = edges[i][2];
                minIndex = i;
            }
        }
        if (flag == true) {
            dis += min;
            join(edges[minIndex][0], edges[minIndex][1]);
        }
    }
    cout << dis << endl;
}

软件构建

  • 这题之前一次笔试写过,当时最后一个元素后也加了空格,导致只过了30%,大家注意下
    代码如下:
#include <iostream>
#include <set>
#include <map>
#include <queue>
#include <stack>
using namespace std;
 
int main() {
    int n, m;
    cin >> n >> m;
    queue<long int> my_resque;
    queue<long int> my_midque;
    map<long int, set<long int>> mymap;
    map<long int, long int> nummap;
    set<long int> res;
    int flag = 0;
    for (int i = 0; i < n; i++) nummap[i] = 0;
    for (int i = 0; i < m; i++) {
        long int a, b;
        cin >> a >> b;
        mymap[b].insert(a);
        nummap[b]=mymap[b].size();
    }
    while (res.size() < n) {
        int num = res.size();
        for (int i = 0; i < n; i++) {
            if (res.find(i) == res.end() && nummap[i] == 0) {
                my_midque.push(i);
                res.insert(i);
                my_resque.push(i);
            }
        }
        if (num == res.size() && num != n) break;
        while (!my_midque.empty()) {
            long int t = my_midque.front();
            my_midque.pop();
            for (int i = 0; i < n; i++) {
                if (res.find(i) == res.end() &&
                    nummap[i] > 0 && mymap[i].find(t) != mymap[i].end())
                    nummap[i]--;
            }
        }
    }
    if (res.size() < n) cout << -1 << endl;
    else {
        while (!my_resque.empty()) 
        {
            if (my_resque.size() > 1)
                cout << my_resque.front() << ' ';
            else cout << my_resque.front();
            my_resque.pop();
        }
        cout << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/743052.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java核心知识(一):JVM

JVM 前言 文本源自微博客 (www.microblog.store),且已获授权. 一、线程 1.1 基本概念 JVM是可运行java代码的假象计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收、堆和一个存储方法域。JVM是运行在操作系统之上的&#xff0c;与硬件没有直接的交互。 1.2 运…

C# 中的 StreamReader 和 StreamWriter 类

在这里插入代码片StreamReader 和 StreamWriter 位于 System.IO 命名空间中。当您想要读取或写入基于字符的数据时&#xff0c;这两个类都很有用。这两个类都处理 Unicode 字符。 StreamReader 派生自抽象类“TextReader”&#xff0c;StreamWriter 派生自“TextWriter”。 下…

金融企业数据跨境流动的核心需求是什么?如何才能落地?

在金融行业&#xff0c;涉及到的数据跨境流动的场景多种多样&#xff0c;主要涉及到金融机构的跨国经营、全球贸易以及服务贸易等多个方面&#xff1a; 企业跨国经营&#xff1a;当金融机构进行跨国经营时&#xff0c;如银行在海外设立分支机构或进行跨境投资&#xff0c;会涉及…

Linux 式套娃,把“文件系统”安装在一个“文件”上?

背景 “文件”在文件系统之中&#xff0c;这是人人理解的概念。但“文件”之上还有一个文件系统&#xff1f;那岂不是成套娃了。但这个其实是可以的。这个就涉及到今天我们要讲的 loop 设备。 很多童鞋在学习 Linux 的文件系统时&#xff0c;涉及到对磁盘设备的格式化&#x…

Spring底层原理之bean的加载方式三 用注解声明配置类 以及@Configuration 和 @Component 的区别

bean的加载方式三 用注解声明配置类 我们之前用组件扫描加上注解定义bean 实现了bean的加载 当我们又会发现这个配置文件过于繁琐 我们可以写一个类 不是配置文件而是配置类 我们接下来只需要把这句话的功能写到 配置类里面 这样书写就行 package com.bigdata1421.config;…

全球社交的连接者:Facebook的跨文化影响力

在当今高度数字化和全球化的时代&#xff0c;社交网络不仅仅是人们交流和连接的工具&#xff0c;更成为促进全球文化交流和理解的重要平台。作为全球最大的社交网络之一&#xff0c;Facebook不仅连接了数十亿用户&#xff0c;还在跨文化交流和社会互动方面发挥着重要作用。本文…

【遇到的问题】集群上查看gpu的使用情况

流程&#xff1a; 查看bme_cpu所有节点的详细情况scontrol show node bme_gpu[12-23] 下面这个看起来分配出去较少 查看bme_cpu空闲节点sinfo -p bme_gpu -o "%n %G %C %m %e NVIDIAA10080GBPCIe 卡 gpu 13看起来最少 在命令中选择这个节点 #!/bin/bash #SBATCH -J rati…

山洪灾害无线预警广播系统解决方案

一、国家政策 2021年水利部印发了《全国山洪灾害防治项目实施方案&#xff08;2021-2023年&#xff09;》&#xff0c;提出“到2023年&#xff0c;山洪灾害防治体系进一步健全&#xff0c;监测预警能力进一步提升&#xff0c;努力补齐山洪灾害防治当前存在的明显短板”的建设目…

思科交换机基本配置命令

01进入特权模式enable switch>enable switch# 02进入全局配置模式configure terminal switch>enable switch#configure terminal switch(conf)# 03交换机命名hostname aptech2950以aptech2950为例 switch>enable switch#configure terminal switch(conf)#hostname apt…

创建App

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Django项目中&#xff0c;推荐使用App来完成不同模块的任务&#xff0c;通过执行如下命令可以启用一个应用程序。 python manage.py startapp app…

allegro 如何替换过孔?

操作步骤如下 1.选择操作对象&#xff08;需要替换的过孔&#xff09;&#xff0c;右键–>Repace……–>Selected…… 2.在弹出的窗口中选择最终需要的过孔既可以

怎么用表单二维码来收集信息?二维码收集信息的制作教程

现在通过二维码来收集用户信息的方式在很多场景中都有应用&#xff0c;随着毕业季的到来学校也开始用这种方式来收集学生的个人信息&#xff0c;学生只需要扫描生成二维码&#xff0c;根据问题填写对应的内容&#xff0c;将数据统计到专门的后台中存储&#xff0c;实现数据的快…

k8s设置pod资源请求和限制

设置资源请求和限制 实验目标&#xff1a; 学习如何为 Pod 设置资源请求和限制&#xff0c;以优化集群资源分配。 实验步骤&#xff1a; 创建一个 Deployment&#xff0c;并设置 CPU 和内存的资源请求和限制。使用 kubectl describe 命令查看资源分配情况。观察资源限制对 P…

IMU应用于颈部健康监测

随着电脑成为日常工作的必备工具&#xff0c;长时间使用电脑导致的颈部疼痛问题日益受到关注。近日&#xff0c;一项创新研究利用IMU开发了一种新型监测系统&#xff0c;用来监测电脑使用者的颈部姿势和疼痛情况。 在为期两天的实验中&#xff0c;8名办公室工作者分别在静态和…

详细介绍iutils.dll丢失的多个解决方法,一键快速修复丢失的iutils.dll文件

当用户遭遇“iutils.dll缺失”的提示时&#xff0c;这通常预示着依赖该库文件的程序将面临启动失败或功能受限的风险。DLL&#xff08;Dynamic Link Library&#xff0c;动态链接库&#xff09;文件无疑占据了核心地位。这些文件就如同建筑师手中的蓝图&#xff0c;为软件的构建…

Linux内核测试技术

Linux 内核是Linux操作系统的核心部分&#xff0c;负责管理硬件资源和提供系统调用接口。随着 Linux 内核的不断发展和更新&#xff0c;其复杂性和代码规模也在不断增加。因此&#xff0c;确保内核的稳定性和可靠性变得尤为重要。内核测试技术是实现这一目标的关键手段。本文将…

数据库管理工具Navicat v17全新发布——释放全新的建模能力

Navicat是一个可连接多种数据库的管理工具&#xff0c;它可以让你以单一程序同时连接到MySQL、Oracle及PostgreSQL数据库&#xff0c;让管理不同类型的数据库更加的方便。 接下来我们将为大家介绍Navicat v17中的一些主要亮点&#xff0c;其释放的全新建模能力、最大化数据可见…

厄瓜多尔海外媒体发稿:大舍传媒-媒体宣发投放需要什么条件?

一、厄瓜多尔媒体 厄瓜多尔媒体有&#xff1a; EcuapaginasEcuapuntoViviendaya 这些媒体都是厄瓜多尔当地颇具影响力的新闻**和社交媒体平台&#xff0c;为广告主和品牌提供了一个广阔的宣传空间。 二、大舍传媒介绍 大舍传媒是一家专业的海外媒体宣发投放&#xff0c;致…

Linux的免交互

交互&#xff1a;我们发出指令控制程序的运行&#xff0c;程序在接收到指令之后按照指令的效果做出对应的反应。 免交互&#xff1a;间接的通过第三方的方式把指令传送给程序&#xff0c;不用直接的下达指令。 1、here document免交互 ere document免交互&#xff1a;是命令…

如何绘制网络安全运营的“谷歌地图”?

正如Google Maps&#xff08;谷歌地图&#xff09;彻底改变了驾车出行时的导航模式一样&#xff0c;通过流程映射绘制一张指导网络安全运营的“电子地图”&#xff0c;可以彻底改变组织理解和管理网络安全运营工作的方式。 现代企业网络安全运营的核心并不是部署防火墙和杀毒软…