每日OJ题_牛客_AB13【模板】拓扑排序_C++_Java

news2024/12/28 19:25:20

目录

牛客_AB13【模板】拓扑排序

题目解析

C++代码

Java代码


牛客_AB13【模板】拓扑排序

【模板】拓扑排序_牛客题霸_牛客网 (nowcoder.com)

描述

        给定一个包含nn个点mm条边的有向无环图,求出该图的拓扑序。若图的拓扑序不唯一,输出任意合法的拓扑序即可。若该图不能拓扑排序,输出−1。


题目解析

拓扑排序裸题,步骤:
  1. 建图。
  2. 入队为 0 的点入队。
  3. 最后来一次层序遍历即可。

C++代码

#include <iostream>
#include <queue>
#include <unordered_map>
#include <vector>
using namespace std;
const int N = 2 * 1e5 + 1;
int main()
{
	int n = 0, m = 0;
	cin >> n >> m;
	int x = 0, y = 0;
	unordered_map<int, vector<int>> Edge;
	vector<int> in(N);
	while (cin >> x >> y) // x 指向 y
	{
		Edge[x].push_back(y);
		in[y]++;
	}
	// for(auto& [a, b] : Edge)
	// {
	// cout << a << " -> ";
	// for(auto& e : b)
	// {
	// cout << e << " ";
	// }
	// cout << endl;
	// }
	// for(auto& e : in)
	// {
	// if(e != 0)
	// cout << e << " ";
	// }
	// cout << endl;
	priority_queue<int> q;
	for (int i = 1; i <= n; ++i)
	{
		if (in[i] == 0)
		{
			q.push(i);
			// cout << "begin" << i;
		}
	}
	vector<int> res;
	while (q.size())
	{
		int tmp = q.top();
		q.pop();
		res.push_back(tmp);
		for (auto& e : Edge[tmp]) // tmp指向的边的入度减一
		{
			in[e]--;
			if (in[e] == 0) // 减为0了就进队列
				q.push(e);
		}
		// // Edge.erase(tmp); // 加这步?
		// for(auto& [a, b] : Edge)
		// {
		// cout << a << " -> ";
		// for(auto& e : b)
		// {
		// cout << e << " ";
		// }
		// cout << endl;
		// }
		// for(int i = 1; i <= n; ++i)
		// {
		// cout << in[i] << " ";
		// }
		// cout << endl;
	}
    if(res.size() != n)
    {
        cout << -1;
    }
    else
    {
        for (int i = 0; i < n - 1; ++i)
        {
            cout << res[i] << " ";
        }
        cout << res[n - 1]; // 666666666666666
    }
	return 0;
}

Java代码

import java.util.*;
import java.io.*;
public class Main
{
    public static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    public static Read in = new Read();
    public static int n, m;
    public static Map<Integer, List<Integer>> edges = new HashMap<>(); // 存储图
    public static int[] cnt; //统计⼊度信息

    public static void main(String[] args) throws IOException
    {
        n = in.nextInt(); m = in.nextInt();
        cnt = new int[n + 1];
        // 1. 建图
        for(int i = 0; i < m; i++)
        {
            int a = in.nextInt(), b = in.nextInt();
            // a -> b
            cnt[b]++;
            if(!edges.containsKey(a))
            {
                edges.put(a, new ArrayList<>());
            }
            edges.get(a).add(b);
        }
        // 2. 拓扑排序
        Queue<Integer> q = new LinkedList<>();
        for(int i = 1; i <= n; i++)
        {
            if(cnt[i] == 0)
            {
                q.add(i);
            }
        }
        int[] ret = new int[n]; // 统计拓扑排序的结果
        int pos = 0;
        while(!q.isEmpty())
        {
            int t = q.poll();
            ret[pos++] = t;
            for(int a : edges.getOrDefault(t, new ArrayList<>()))
            {
                cnt[a]--;
                if(cnt[a] == 0)
                {
                    q.add(a);
                }
            }
        }
        if(pos == n)
        {
            // 输出结果:输出最后⼀个数的时候,不能有空格
            for(int i = 0; i < n - 1; i++)
            {
                out.print(ret[i] + " ");
            }
            out.println(ret[n - 1]);
        }
        else
        {
            out.println(-1);
        }

        out.close();
    }
}
class Read // ⾃定义快速读⼊
{
    StringTokenizer st = new StringTokenizer("");
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    String next() throws IOException 
    {
        while(!st.hasMoreTokens())
        {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }
    String nextLine() throws IOException 
    {
        return bf.readLine();
    }

    int nextInt() throws IOException 
    {
        return Integer.parseInt(next());
    }

    long nextLong() throws IOException 
    {
        return Long.parseLong(next());
    }

    double nextDouble() throws IOException 
    {
        return Double.parseDouble(next());
    }
}

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

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

相关文章

The Sandbox 全新游戏赛季 Alpha 第 4 季完整攻略

欢迎来到 Alpha 第 4 季攻略&#xff01; 准备好投入 The Sandbox 有史以来最令人兴奋的游戏赛季吧&#xff01;我们诚邀你于 10 月 9 日晚上 10 点&#xff08;北京时间&#xff09;&#xff0c;加入我们为期 10 周的精彩平台活动&#xff0c;其中包含超过 100 个独特游戏体验…

杭州悦数参与制定的图技术国家标准项目进入公示期!

9 月 27 日&#xff0c;由全国智能计算标准化工作组归口&#xff0c;杭州悦数科技有限公司等多家知名企业及科研机构共同参与的 《智能计算 图计算性能测试方法》 国家标准项目正式进入公示期。作为第一个图技术相关的国家标准&#xff0c;这一里程碑式的进展&#xff0c;不仅标…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【297-313】

文章目录 297. super基本语法297.1 基本介绍297.2 基本语法 298. super使用细节1299. super使用细节2300. super使用细节3301. 方法重写介绍302. 方法重写细节303. 重写课堂练习1304. 重写课堂练习2输出结果&#xff1a; 姓名&#xff1a;田所浩二 年龄:24305. 养宠物引出多态3…

直面商标管理难题,开启商标管理系统的解决方案

商标管理对于企业的品牌建设和市场竞争至关重要。然而&#xff0c;商标管理并非一帆风顺&#xff0c;其中存在着诸多难题。 1. 商标监测与侵权防范&#xff1a;随着市场竞争的加剧&#xff0c;及时发现潜在的侵权行为变得越来越困难。监测范围广泛&#xff0c;包括线上线下各种…

华为免费杀毒软件 | HiSec Endpoint 智能终端安全系统

HiSec Endpoint智能终端安全系统是由华为开发的一款全面的终端安全防护产品。该系统的核心目的是保护终端资产的安全&#xff0c;防止各种网络威胁。能够实时感知终端异常行为&#xff0c;多维检测识别潜在安全威胁&#xff0c;自动处置威胁事件&#xff0c;智能溯源入侵路径&a…

直击工博会 | 万物集与四大供应商强强联手,开启战略合作新纪元!

9月24日&#xff0c;第24届中国国际工业博览会在国家会展中心&#xff08;上海&#xff09;开幕。本届工博会设置数控机床与金属加工展、工业自动化展、节能与工业配套展、新一代信息技术与应用展等9大专业主题展&#xff0c;吸引28个国家和地区2600家企业参展。万物集作为参展…

SeaboxSQL

目录 一、基本架构 0、数据模型 1、主从集群 2、分库分表 二、部署安装 1、配置要求 2、前置依赖 3、安装步骤 三、基本操作 1、实例启停 2、命令执行 3、基本查询 4、表空间管理 4、用户管理 6、数据库操作 7、SCHEMA操作 8、表操作 9、日志操作 &…

立即升级!Windows11 24H2 正式版 V26100.2033!

今日&#xff0c;系统之家小编给您带来2024年10最新推出了Windows11 24H2正式版系统下载&#xff0c;该版本系统以微软官方Windows11 24H2 26100.2033 专业版为基础&#xff0c;展开离线制作与优化&#xff0c;安全无毒&#xff0c;且修复了之前版本存在的蓝屏、绿屏等问题&…

多模态大语言模型(MLLM)-InstructBlip深度解读

前言 InstructBlip可以理解为Blip2的升级版&#xff0c;重点加强了图文对话的能力。 模型结构和Blip2没差别&#xff0c;主要在数据集收集、数据集配比、指令微调等方面下文章。 创新点 数据集收集&#xff1a; 将26个公开数据集转换为指令微调格式&#xff0c;并将它们归类…

五、Python基础语法(程序的输入和输出)

一、输入 输入&#xff1a;输入就是获取键盘输入的数据&#xff0c;使用input()函数。代码会从上往下执行&#xff0c;当遇到input()函数&#xff0c;就会暂停执行&#xff0c;输入内容后&#xff0c;敲回车键&#xff0c;表示本次的输入结束。input函数得到的数据类型都是字符…

≌图概念凸显有长度不同的射线

黄小宁 【摘要】自有射线概念后的2300年里一直无人能知有长度不同的射线、无人能知有互不≌的射线&#xff0c;从而使数学一直有几何“常识”&#xff1a;任何射线都没有长度差别。保距变换和≌图概念使人能一下子看到有长度不同的射线。 变量x所取各数也均由x代表&#xff0c…

【电子通识】TINA-TI 安装

TINA-TI是一个SPICE的模拟仿真程序&#xff0c;提供了 SPICE 所有的传统直流、瞬态和频域分析以及更多功能。 TINA 具有允许您按照希望的方式设置结果的格式。虚拟仪器允许选择输入波形、探针电路节点电压和波形。 下载链接&#xff1a;TINA-TI 模拟工具 | 德州仪器 TI.com.cn …

计算机网络:数据链路层 —— 数据链路层概述

文章目录 数据链路层主要功能 基本概念链路数据链路帧 数据链路层 在计算机网络中&#xff0c;链路层&#xff08;Data Link Layer&#xff09;是网络协议栈中的一层&#xff0c;负责管理和控制链路的建立、维护和释放&#xff0c;以及处理链路层的数据帧传输和错误控制等功能…

为什么使用元空间替代了永久代

为什么使用元空间替代了永久代 简单来说&#xff1a; 永久代是JVM内存是有上限的&#xff0c;而元空间是存储本地内存里&#xff0c;内存上限比较大。避免频繁出现OOM问题。 永久代对象是通过Full GC进行内存清理&#xff0c;元空间是由操作系统内存管理机制处理&#xff0c;…

安卓APP 构建

安卓开发 … 现在估计都是前端构建了 … … 可以写一些自己调试设备用的工具,串口连接或者网口链接,USB 链接等等 现在的应用开发,都趋向于脚本开发了,不用造轮子 … … 轻开发重分析 再搭配一个无线调试设备,非常好用

关于AOT、JIT编译模式以及基于静态编译构建微服务应用

JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation) 。和 JIT 不同的是&#xff0c;这种编译模式会在程序被执行前就将其编译成机器码&#xff0c;属于静态编译&#xff08;C、 C&#xff0c;Rust&#xff0c;Go 等语言就是静态编译&#xff09;。AOT 避免了 JIT 预…

excel表格转换为在线成绩查询怎么制作?

在当前“双减”政策的背景下&#xff0c;学生的考试成绩不再被公开展示&#xff0c;这是对学生隐私的一种保护。然而&#xff0c;这同时也带来了一个新的问题&#xff1a;家长们对于孩子成绩的关切并未减少&#xff0c;他们依然迫切想要了解孩子的学习情况。以往&#xff0c;成…

webGL进阶(一)多重纹理效果

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

[JAVA]连接数据库 并在Java中实现查询员工信息功能

在进行这些操作之前&#xff0c;我们需要先了解JDBC入门&#xff0c;JDBC是一种用于执行SQL语句的JavaAPL&#xff0c;可以为多种关系数据库提供统一访问。 一&#xff0c;主要作用 1.连接数据库 允许Java程序与各种不同的数据库建立连接。无论使用的是MySQL&#xff0c;Ora…

高效开发,低代码平台如何助力构建内部工具

Zoho Creator是低代码平台&#xff0c;助力快速构建内部工具&#xff0c;如审批、订单、销售管理等&#xff0c;提升生产力、客户满意度&#xff0c;并减轻管理负担。平台提供拖放界面、集成数据库等功能&#xff0c;入选Gartner低代码平台“魔力象限”。 一、什么是内部工具&a…