建图,链式前向星,拓扑排序

news2024/11/15 13:39:59

建图,链式前向星,拓扑排序

  • 建图的三种方式
    • 1.邻接矩阵
    • 2.邻接表
    • 3.链式前向星
  • 拓扑排序
    • 练习题-课程表
    • 字典序最小的拓扑排序
      • 拓扑排序模板
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例 #1
        • 样例输入 #1
        • 样例输出 #1
      • 提示
  • 例题
    • 1.火星字典
    • 2.戳印序列


建图的三种方式

1.邻接矩阵

邻接矩阵,a[i,j]==true,代表i ——>j

2.邻接表

vector<vector< int >>arr
(1)有向图

  • 无权图:vector<vector< int >>arr
  • 有权图:vector<vector< pair< int,int > >>arr
    (2)无向图

3.链式前向星

head[i]=j:表示节点i此时的第一条边为j号边;
next[i]=j:一个链表,表示i号边后面连着j号边;若j为 0,表示到尾巴了
to[i]=j:表示i号边去往j节点;
weight[i]=j:表示i号边的权重为j;
cnt:代表以及申请了几条边;

拓扑排序

定义入度:一个节点被指向的边数
进行下面过程:找出所有入度为0的点,将他们排在前面,然后删去他们以及他们的影响,重复上述行为。若发现过程中找不到入度为0的点,那么该图无法拓扑排序(也说明存在有向环);

练习题-课程表

在这里插入图片描述
有向边代表依赖关系

class Solution {
public:
    int q[2003];
    vector<int> findOrder(int n, vector<vector<int>>& prerequisites) {
        vector<int>ans;
        vector<int>kong;
        int cnt=0;
        vector<int>indegree(n,0);
        vector<vector<int>> g(n);
        for(auto p:prerequisites){
            indegree[p[0]]++;
            g[p[1]].push_back(p[0]);
        }
        int l=0,r=0;
        for(int i=0;i<n;i++){
            if(indegree[i]==0){
                q[r++]=i;
            }
        }
        while(l<r){
            int now=q[l++];
            cnt++;
            ans.push_back(now);
            for(int next:g[now]){
                if((--indegree[next])==0){
                    q[r++]=next;
                }
            }
        }
        return cnt==n ? (ans): (kong);
    }
};

字典序最小的拓扑排序

拓扑排序模板

题目描述

有向无环图上有n个点,m条边。求这张图字典序最小的拓扑排序的结果。字典序最小指希望排好序的结果中,比较靠前的数字尽可能小。

输入格式

第一行是用空格隔开的两个整数n和m,表示n个点和m条边。

接下来是m行,每行用空格隔开的两个数u和v,表示有一条从u到v的边。

输出格式

输出一行,拓扑排序的结果,数字之间用空格隔开

样例 #1

样例输入 #1
5 3
1 2
2 4
4 3
样例输出 #1
1 2 4 3 5

提示

1 ≤ n , m ≤ 1 0 5 1 \leq n,m \leq 10^5 1n,m105

注意:图上可能有重边

把队列换成优先队列就行了

#include<bits/stdc++.h>
using namespace std;
#define N 10002
priority_queue<int,vector<int>,greater<int>> q;
int ans[100002];
int cnt=0;
int main(){
    int n,m;
    cin>>n>>m;
    vector<vector<int>> g(n+1);
    vector<int> ig(n+1,0);
    for(int i=0;i<m;i++){
        int x,y;
        cin>>x>>y;
        ig[y]++;
        g[x].push_back(y);
    }
    for(int i=1;i<=n;i++){
        if(ig[i]==0){
            q.push(i);
        }
    }
    while(!q.empty()){
        int now=q.top();
        ans[cnt++]=now;
        q.pop();
        for(int next:g[now]){
            if((--ig[next])==0){
                q.push(next);
            }
        }
    }
    for(int i=0;i<cnt;i++){
        cout<<ans[i]<<' ';
    }
    return 0;
}

例题

1.火星字典


https://leetcode.cn/problems/Jf1JuT/description/
有向边代表大小关系

class Solution {
public:
    int ig[30];
    int q[100];
    int cnt=0;
    int real=0;
    string alienOrder(vector<string>& words) {
        string ans;
        fill(ig,ig+30,-1);
        vector< vector<int>> g(30);
        for(string x:words){
            for(char tmp:x){
                if(ig[tmp-'a']==-1){
                    ig[tmp-'a']=0;
                    real++;
                }
            }
        }
        for(int i=0;i<(words.size()-1);i++){
            string x=words[i],y=words[i+1];
            int j;
            for( j=0;(j<x.length())&&(j<y.length());j++){
                if(x[j]!=y[j]){
                    ig[y[j]-'a']++;
                    g[x[j]-'a'].push_back(y[j]-'a');
                    break;
                }
            }
            if(j<x.length() && j==y.length())return "";
        }
        int l=0,r=0;
        for(int i=0;i<26;i++){
            if(ig[i]==0){
                q[r++]=i;
            }
        }
        while(l<r){
            int now=q[l++];
            ans+=(now+'a');
            cnt++;
            for(int next:g[now]){
                if((--ig[next])==0){
                    q[r++]=next;
                }
            }
        }
        return cnt==real ? ans : "";
    }
};

2.戳印序列


https://leetcode.cn/problems/stamping-the-sequence/
有点难度,很难想到用拓扑排序
我们发现以下性质,1、如果最终能够得到target,那么最后一步的印章一定是都对得上的
2.不会重复印同一个位置,所以无需找最优解,我们只需判断每个位置都印一遍是否可行,所以最终判断的是数组ans大小是否等于n-m+1
一种隐蔽的拓扑排序,即前一次盖章对后一次盖章有依赖关系

class Solution {
public:
    int q[1003];
    bool flag[1003];//保证target每个位置都最多查询一遍
    vector<int> kong;
    vector<int> movesToStamp(string stamp, string target) {
        int n=target.length(),m=stamp.length();
        vector<int> ans;
        vector<int> ig(n-m+1,0);
        vector<vector<int>> g(n+1);
        for(int i=0;i<n-m+1;i++){
            for(int j=0;j<m;j++){
                if(stamp[j]!=target[i+j]){
                    ig[i]++;
                    g[i+j].push_back(i);//g[x]表示与target中x下标位置不相同的印章位置
                }
            }
        }
        int l=0,r=0;
        for(int i=0;i<n-m+1;i++){
            if(ig[i]==0){
                q[r++]=i;
            }
        }
        while(l<r){
            int now=q[l++];
            ans.push_back(now);
            for(int k=now;k<now+m && k<n;k++){
                if(!flag[k]){
                    flag[k]=1;
                    for(int j:g[k]){
                        if((--ig[j])==0){
                            q[r++]=j;
                        }
                    }
                }
            }
        }
        if(ans.size()!=n-m+1)return kong;
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

485,Modbus,开关量,UART,I2C,4-20mA,0-5V,TTL接口区别

工业和电子通信中最常见的几种类型&#xff0c;它们在数据传输方式、信号类型、通信协议、应用领域和物理特性上有所不同。下面分别解释这些接口的区别&#xff1a; 1. RS-485 类型&#xff1a;半双工差分信号传输。用途&#xff1a;用于长距离、多点通信场合&#xff0c;如楼…

Redis--12--1--分布式锁---java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis与分布式锁Jedis实现1.RedisConfig2.RedisDistLock3.应用4.加上看门狗逻辑 RedisDistLockWithDog redisson实现1.依赖2.代码 Redis与分布式锁 Jedis实现 1.Re…

spring security如何适配盐存在数据库中的密码

19.token认证过滤器代码实现_哔哩哔哩_bilibili19.token认证过滤器代码实现是SpringSecurity框架教程-Spring SecurityJWT实现项目级前端分离认证授权-挑战黑马&尚硅谷的第20集视频&#xff0c;该合集共计41集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信

目录 引言 5.4 直接C2通信 5.4.1 概述 5.4.2 A2X直接C2通信服务的授权策略 5.4.3 USS使用A2X直接C2通信服务的C2授权程序 5.4.4 直接C2通信建立程序 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别…

手动构建线性回归(PyTorch)

import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt import random #1.构建数据 #构建数据集 def create_dataset():x,y,coefmake_regression(n_samples100,n_features1,random_state0,noise10,coefTrue,bias14.5)#将构建数据转换为张…

AI大模型的风过去了?不,是离我们越来越近了

OpenAI摊牌了。不再掩藏锋芒&#xff0c;拿年初预测的2亿美元收入做挡箭牌&#xff0c;“我们的年营收达到了13亿美元。”10月中旬Sam Altman终于透露出来。13亿美元&#xff0c;同比增长4500%。 国内。资本和公众的视线越来越多地放在局势变幻、芯片和造车上。 △三季度融资行…

学习系列一:YOLO系列目标检测框架之间介绍及对比

YOLO系列目标检测框架之间介绍及对比 华为HCIP AI高级工程师证书&#xff0c; 华为HCIA AI证书&#xff0c;目前从事视觉算法工作 文章目录 YOLO系列目标检测框架之间介绍及对比前言一、YOLOv1二、YOLOv2三、YOLOv3四、YOLOv4五、YOLOv5及后续算法 前言 YOLO系列算法 YOLO 创…

《0基础》学习Python——第十七讲__正则表达式(requests)

一、什么是正则表 正则表达式是一种用于匹配和操作字符串的强大工具。它可以用于检索、替换和验证字符串。正则表达式使用特定的语法来描述字符串的模式&#xff0c;然后用于查找符合该模式的字符串。 在Python中&#xff0c;可以使用re模块来使用正则表达式。re模块提供了一组…

启动流程和切换流程

启动流程 #mermaid-svg-iUWGw8xl1SyAmoo9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-icon{fill:#552222;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-text{fill:#552222;stroke:#552222;}#…

3D培训大师创新培训体验,加速空调关键组件的高效精准安装

如今&#xff0c;空调系统的复杂性和精密性与日俱增&#xff0c;对专业技术人员的要求也日益提高。尤其是决定空调是否能平稳运行的空调关键组件的装配培训&#xff0c;不再局限于传统的理论讲解和实体模型演示&#xff0c;而是更注重数字化、沉浸式学习。 案例背景 某空调公…

代码随想录算法训练营Day26 | 491.递增子序列 | 46.全排列 | 47.全排列 II | 332.重新安排行程 | 51.N皇后 | 37.解数独

今日任务 491.递增子序列 题目链接&#xff1a; https://leetcode.cn/problems/non-decreasing-subsequences/description/题目描述&#xff1a; Code class Solution { public:vector<vector<int>> findSubsequences(vector<int>& nums) {vector&l…

[PM]数据分析

概览 数据的定义 运营数据 分析的目的 数据分析流程 1.明确目标 2.数据来源 3.采集数据 4.数据整理 5.数据分析 趋势分析 当数据出现异常&#xff0c;一般从3个角度去查找问题&#xff1a; 1.技术层面&#xff0c;是不统计出错&#xff0c;或者产品出现bug 工 2.产品层面&am…

haproxy服务介绍

haproxy 搭建使用开启HAProxy的界面UI配置负载均衡配置web代理 HAProxy&#xff08;High Availability Proxy&#xff09;是一个高性能的TCP/HTTP负载均衡器和代理服务器&#xff0c;广泛用于提升Web应用的可用性和性能。[官网说明](https://docs.haproxy.org/2.8/intro.html#3…

羊大师:户外狂欢羊奶滋养,年轻人的活力养生新潮流

在这个快节奏的时代&#xff0c;年轻人正以他们独有的方式&#xff0c;重新定义着健康与养生的概念。他们深知&#xff0c;气血不足不应是青春的代名词&#xff0c;而应是活力四射的前奏。于是&#xff0c;一群年轻人以“发癫式”打卡的创意方式&#xff0c;将户外活动的乐趣推…

[保姆级教程]uniapp安装使用uViewUI教程

文章目录 创建 UniApp 项目下载uView UI下载安装方式步骤 1: 安装 uView UI步骤 2: 查看uView UI是否下载成功步骤 3: 引入 uView 主 JS 库步骤 4: 引入 uView 的全局 SCSS 主题文件步骤 5: 引入 uView 基础样式步骤 6: 配置 easycom 组件模式注意事项 NPM方式步骤 1: 安装 uVi…

跟代码执行流程,读Megatron源码(二)训练入口pretrain_gpt.py

Megatron-LM默认支持GPT、T5、BERT等多个常见模型的预训练&#xff0c;当下大模型流行&#xff0c;故以pretrain_gpt.py为例做源码的走读。 一. 启动pretrain_gpt.py pretrain_gpt.py为GPT类模型的训练入口&#xff0c;它通过命令行形式被调用&#xff0c;其精确执行路径位于M…

n7.Nginx 第三方模块

Nginx 第三方模块 第三模块是对nginx 的功能扩展&#xff0c;第三方模块需要在编译安装Nginx 的时候使用参数–add-modulePATH指定路径添加&#xff0c;有的模块是由公司的开发人员针对业务需求定制开发的&#xff0c;有的模块是开 源爱好者开发好之后上传到github进行开源的模…

初学Linux之常见指令(上)

初学Linux之常见指令&#xff08;上&#xff09; 文章目录 初学Linux之常见指令&#xff08;上&#xff09;1. Linux下的小技巧热键man 指令 2. ls 指令3. pwd 指令4. cd 指令5. tree 指令6. touch 指令7. mkdir 指令8. rmdir 和 rm 指令9. cp 指令10. mv 指令 1. Linux下的小技…

微信小程序:vant-weapp 组件库、css 变量

vant-weapp 组件库 前往 vant-weapp 官网 npm 使用限制&#xff1a;不支持依赖于 Node.js 内置库、浏览器内置对象、C 插件 的包。 安装 vant-weapp # 通过 npm 安装 npm i vant/weapp -S --production# 通过 yarn 安装 yarn add vant/weapp --production# 安装 0.x 版本 npm i…